许多文本文件中的大量数据 - 如何处理?

时间:2010-05-30 05:06:28

标签: python sql r large-files large-data-volumes

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

是一些候选解决方案
  1. 用C语言写出整个内容 的Fortran)
  2. 将文件(表格)导入到 关系数据库直接和 然后在R或Python中删除块 (有些转变不是 适用于纯SQL解决方案)
  3. 用Python编写全部内容
  4. (3)会是个坏主意吗?我知道你可以在Python中包装C例程,但在这种情况下,由于没有任何计算上的限制(例如,需要许多迭代计算的优化例程),我认为I / O可能与计算本身一样是瓶颈。您对进一步的考虑或建议有什么建议吗?感谢

    修改感谢您的回复。关于Hadoop的看法似乎存在冲突,但无论如何我都无法访问集群(虽然我可以使用几台非网络设备)......

8 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:13)

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

  • 您似乎知道R,因此您可以快速使用代码
  • 每个文件30 mb在标准工作站上并不大,只有几GB的ram
  • 如果您通过read.csv()参数指定列的类型,则read.table()的{​​{1}}变体非常有效:而不是用于转换的guestimating类型,这些将得到有效处理
  • 这里的瓶颈是来自磁盘的i / o,对于每种语言都是相同的
  • R有multicore在具有多个核心的机器上设置并行处理(类似于Python的多处理,似乎)
  • 如果您想使用问题的“令人尴尬的并行”结构,R有几个非常适合数据并行问题的软件包:例如snowforeach可以分别部署在一台计算机上,也可以部署在一组联网计算机上。

答案 2 :(得分:6)

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

答案 3 :(得分:4)

使用太字节,无论如何,您都希望将读取并行化为多个磁盘;所以不妨直接进入Hadoop。

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

答案 4 :(得分:4)

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

以下是您可能会发现有用的资源:

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

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

答案 5 :(得分:2)

如果您拥有一组计算机,则可以使用Hadoop Mapreduce并行化您的应用程序。尽管Hadoop是用Java编写的,但它也可以运行Python。您可以查看以下链接,了解并行化代码的指示 - PythonWordCount

答案 6 :(得分:2)

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

在情况(1)和(3)中,您需要每次处理文件(前面所述的大部分时间/资源消耗),除非您找到存储结果的方法并使用新文件更新它们。

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

答案 7 :(得分:1)

是。你是对的! I / O将耗费大部分处理时间。我不建议您使用像hadoop这样的分布式系统来完成这项任务。

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

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