32

我有大量数据(几 TB)并且正在积累......它们包含在许多以制表符分隔的平面文本文件中(每个大约 30MB)。大部分任务涉及读取数据并根据一系列谓词语句对观察/行进行聚合(求和/平均+附加转换),然后将输出保存为文本、HDF5 或 SQLite 文件等。我通常使用 R对于此类任务,但我担心这可能有点大。一些候选解决方案是

  1. 用 C(或 Fortran)编写整个内容
  2. 将文件(表)直接导入关系数据库,然后在 R 或 Python 中提取块(某些转换不适用于纯 SQL 解决方案)
  3. 用 Python 编写整个事情

(3)会是一个坏主意吗?我知道您可以在 Python 中包装 C 例程,但在这种情况下,由于没有任何计算上的限制(例如,需要许多迭代计算的优化例程),我认为 I/O 可能与计算本身一样成为瓶颈。您对进一步的考虑或建议有什么建议吗?谢谢

编辑感谢您的回复。关于 Hadoop 似乎存在相互矛盾的意见,但无论如何我都无法访问集群(尽管我可以使用几台未联网的机器)......

4

8 回答 8

14

(3) 不一定是个坏主意——Python 可以轻松处理“CSV”文件(尽管 C 代表逗号,但制表符作为分隔符同样易于处理),当然也可以获得同样多的带宽在 I/O 操作中与任何其他语言一样。至于其他建议,numpy除了快速计算(根据您的陈述您可能不需要)之外,还提供了非常方便、灵活的多维数组,这对于您的任务可能非常方便;标准库模块multiprocessing让您可以利用多个内核来完成任何易于并行化的任务(这很重要,因为如今几乎每台机器都有多核;-)。

于 2010-05-30T05:12:11.227 回答
13

好的,所以只是为了与众不同,为什么不是 R?

  • 您似乎了解 R,因此您可以快速开始工作代码
  • 在具有几 GB 内存的标准工作站上,每个文件 30 mb 并不大
  • 如果您通过参数指定列的类型,则的read.csv()变体read.table()可能非常有效colClasses:而不是猜测类型进行转换,这些将有效地处理
  • 这里的瓶颈是来自磁盘的 i/o,这对于每种语言都是一样的
  • R 具有多核,可以在具有多核的机器上设置并行处理(似乎类似于 Python 的多处理)
  • 如果您想使用问题的“令人尴尬的并行”结构,R 有几个非常适合数据并行问题的包:例如,foreach可以分别部署在一台机器上,或者部署在一组联网机器上.
于 2010-05-30T19:28:18.633 回答
6

看看迪斯科。它是一个轻量级的分布式 MapReduce 引擎,用大约 2000 行 Erlang 编写,但专为 Python 开发而设计。它不仅支持处理您的数据,还支持可靠地存储复制。他们刚刚发布了 0.3 版,其中包括一个索引和数据库层。

于 2010-05-30T05:13:27.213 回答
4

对于 TB,您无论如何都希望在许多磁盘上并行读取;所以还不如直接进入Hadoop。

使用 Pig 或 Hive 查询数据;两者都广泛支持用户定义的转换,因此您应该能够使用自定义代码实现您需要做的事情。

于 2010-05-30T05:30:47.437 回答
4

我在 Amazon 的 Elastic Map Reduce 上使用 R 和 Hadoop 很幸运。使用 EMR,您只需为您使用的计算机时间付费,而 AMZN 负责启动和关闭实例。究竟如何在 EMR 中构建工作实际上取决于您的分析工作流程的结构。例如,一项作业所需的所有记录是否完​​全包含在每个 csv 中,或者您是否需要每个 csv 中的位来完成分析?

以下是一些您可能会觉得有用的资源:

我在博文中提到的问题更多的是受 CPU 限制,而不是 IO 限制。您的问题更多是 IO,但加载库和缓存文件的提示可能有用。

虽然尝试将其推入/推出关系数据库很诱人,但我建议仔细考虑您是否真的需要 RDB 的所有开销。如果您不这样做,那么您可能会造成瓶颈和开发挑战而没有真正的回报。

于 2010-06-01T18:22:36.280 回答
2

如果您有一个机器集群,您可以使用 Hadoop Mapreduce 并行化您的应用程序。尽管 Hadoop 是用 Java 编写的,但它也可以运行 Python。您可以查看以下链接以获取并行化代码的指针 - PythonWordCount

于 2010-05-30T05:16:33.183 回答
2

当您说“累积”时,解决方案(2)看起来最适合问题。
初始加载到数据库后,您只需使用新文件更新数据库(每天,每周?取决于您需要的频率)。

在情况 (1) 和 (3) 中,您每次都需要处理文件(前面说过最耗费时间/资源),除非您找到一种方法来存储结果并使用新文件更新它们。

您可以使用 R 将文件从 csv 处理到例如 SQLite 数据库。

于 2010-05-31T08:54:21.687 回答
1

是的。你说的对!I/O 将花费您大部分的处理时间。我不建议你使用分布式系统,比如 hadoop,来完成这个任务。

您的任务可以在一个普通的工作站中完成。我不是 Python 专家,我认为它支持异步编程。在 F#/.Net 中,该平台对此提供了很好的支持。我曾经做过一项图像处理工作,在磁盘上加载 20K 图像并将它们转换为特征向量只需要并行几分钟。

总而言之,并行加载和处理您的数据并将结果保存在内存中(如果小),在数据库中(如果大)。

于 2010-05-30T05:27:53.163 回答