2010-05-30 296 views
30

我有大量的数据(几TB)并累积...它们包含在许多制表符分隔的文本文件中(每个大约30MB)。大部分任务包括读取数据并基于一系列谓词语句对观察值/行进行汇总(汇总/平均+附加转换),然后将输出保存为文本,HDF5或SQLite文件等。我通常使用R对于这样的任务,但我担心这可能有点大。一些候选方案是很多文本文件中的大量数据 - 如何处理?

  1. 写了整个事情在C(或 的Fortran)
  2. 导入的文件(表)到直接在 关系数据库和 然后决绝的R或Python的 块(一些变换的不 适合纯SQL的解决方案)
  3. 用Python语言编写整个事情

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

编辑感谢您的答复。似乎有发生冲突约Hadoop的意见,但在任何情况下,我没有访问到群集(虽然我可以用几个unnetworked机)...

+1

伟大的问题,这听起来像我与生物序列数据相同的问题。 – Stedy 2010-06-01 18:47:10

回答

13

(3)不一定是一个坏主意 - 的Python可以轻松处理“CSV”文件(尽管C代表逗号,Tab作为分隔符同样容易处理),并且当然在I/O操作中获得的带宽与任何其他语言一样多。至于其他建议,除了快速计算(您可能不需要按照您的语句),numpy提供了非常方便灵活的多维数组,这对您的任务来说可能非常方便;标准库模块multiprocessing允许您针对任何易于并行化的任务利用多个内核(因为现在几乎每台机器都具有多内核;-),因此很重要。

+0

我想我会给Python,NumPy和多处理一个尝试......非常感谢。 – hatmatrix 2010-05-30 10:38:15

+0

同意。 Python所假设的性能损失在现实世界中并没有多大表现。 – 2010-05-30 23:25:14

6

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

+0

谢谢 - 我必须留意迪斯科。尽管我在数据库层找不到太多文档,但也许MapReduce框架目前不适合我的硬件...... – hatmatrix 2010-05-30 10:37:26

+0

Discodb是一个穷人的数据库。它基本上只是一个位于ddfs之上的分布式散列表。我自己也不太了解,因为它太新颖了。 – 2010-05-30 22:14:48

2

如果您拥有一组机器,则可以使用Hadoop Mapreduce并行化您的应用程序。虽然Hadoop是用Java编写的,但它也可以运行Python。您可以检出以下链接指针在并行代码 - PythonWordCount

+0

谢谢〜没有这个网络机群集虽然... – hatmatrix 2010-05-30 12:42:55

1

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

你的任务可以在一个适中的工作站完成。我不是Python专家,我认为它支持异步编程。在F#/ .Net中,该平台对此非常支持。我曾经做过一个图像处理工作,将20K图像加载到磁盘上并将它们转换成特征矢量只需要花费几分钟的时间。总而言之,并行加载和处理数据并将结果保存在内存(如果很小),数据库(如果很大)中。

+0

谢谢 - 我希望如此。我所拥有的只是一些适度的工作站(有时候) – hatmatrix 2010-05-30 12:41:47

4

使用千兆字节,无论如何都需要将读取操作并行化到多个磁盘;所以不妨直接进入Hadoop。

使用Pig或Hive查询数据;都对用户定义的转换有广泛的支持,所以你应该能够实现你使用自定义代码所需做的。

+0

不知道猪或蜂巢 - 会记住这一点...... – hatmatrix 2010-05-30 12:42:05

13

好吧,只是为了不同,为什么不是R?

  • 你似乎知道[R,所以你可能会得到工作代码每个文件快速
  • 30 MB是RAM的几个GB标准的工作站上并不大
  • read.table()read.csv()变体可以是非常有效的如果您通过colClasses参数指定类型的列:不是guestimating类型转换,这将有效地处理
  • 这里的瓶颈是I/O从磁盘,这是对每一种语言
  • R具有0相同在多核心机器上设置并行处理(类似于Python的多处理,看起来好像)
  • 如果你想采用问题的'尴尬平行'结构,R有几个非常适合数据处理的软件包,并行问题:例如snowforeach可以分别部署在一台机器上或一台联网机器上。
+0

我认为它可以用R完成,但我觉得它的一部分不是正确的工具?虽然所有额外的考虑,你已经包括它当然可以工作......我最近开始使用data.frame(扫描(文件名,什么=列表(...))),以加快输入,但指定colClasses可能只是另一个好主意。谢谢〜 – hatmatrix 2010-05-31 05:46:08

+2

@Stephen不要忘记检查这个线程http://stackoverflow.com/questions/1727772/quickly-reading-very-large-tables-as-dataframes-in-r – Marek 2010-05-31 08:44:31

+0

谢谢!我一直是一个长期的R用户,但这是非常有帮助的 – hatmatrix 2010-06-01 01:26:00

2

当你说“积累”,那么解决方案(2)看起来最适合于问题。
初始加载到数据库后,您只能用新文件更新数据库(每日,每周?取决于您需要多长时间一次)。 (1)和(3)您每次需要处理文件(之前所述的大部分时间/资源消耗),除非您找到存储结果并用新文件更新它们的方法。

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

+0

啊,是的,我明白你的意思......但是一旦我处理每个文本文件,我会将结果最有可能存储在SQLite文件中并工作与这些结果进行后分析。我所做的汇总是一种时间平均(这是纵向数据),所以我不必在分析当前文件时重新导入以前的文件(这就是为什么MapReduce会有意义,我猜...)。 – hatmatrix 2010-06-01 03:02:33

4

我在Amazon的Elastic Map Reduce上使用R和Hadoop的运气不错。通过EMR,您只需支付您使用计算机的时间,而AMZN负责启动和停止实例。具体如何构建EMR中的工作真的取决于您的分析工作流程的结构。例如,一个作业所需的所有记录是否完​​全包含在每个csv中,还是需要每个csv中的位来完成分析?

下面是一些你可能会发现有用的资源:

我在博客文章中提到的问题更多的是CPU绑定,而不是IO绑定。你的问题是更多的IO,但加载库和缓存文件的提示可能会有用。

尽管试图将其推入/移出关系数据库是一种诱惑,但我建议您仔细考虑是否真的需要RDB的所有开销。如果你不这样做,那么你可能会创造一个瓶颈和发展挑战,而没有真正的奖励。

+0

非常感谢 - 我想问一个问题,是否值得将数据传输到基础设施的开销? – hatmatrix 2010-06-02 06:20:59