我有大量数据(几TB)并且累积......它们包含在许多制表符分隔的平面文本文件中(每个大约30MB)。大多数任务涉及读取数据并基于一系列谓词语句聚合(求和/平均+附加转换)观察/行,然后将输出保存为文本,HDF5或SQLite文件等。我通常使用R对于这样的任务,但我担心这可能有点大。
是一些候选解决方案(3)会是个坏主意吗?我知道你可以在Python中包装C例程,但在这种情况下,由于没有任何计算上的限制(例如,需要许多迭代计算的优化例程),我认为I / O可能与计算本身一样是瓶颈。您对进一步的考虑或建议有什么建议吗?感谢
修改感谢您的回复。关于Hadoop的看法似乎存在冲突,但无论如何我都无法访问集群(虽然我可以使用几台非网络设备)......
答案 0 :(得分:14)
(3)不一定是个坏主意 - Python可以很容易地处理“CSV”文件(尽管C代表逗号,但作为分隔符的选项卡也很容易处理)当然可以得到I / O操作中的带宽与任何其他语言一样多。至于其他建议,numpy
,除了快速计算(根据你的陈述你可能不需要),它提供了非常方便,灵活的多维数组,这对你的任务来说非常方便;标准库模块multiprocessing
允许您为任何易于并行化的任务利用多个核心(这一点很重要,因为现在几乎每台机器都有多核; - )。
答案 1 :(得分:13)
好的,只是为了与众不同,为什么不R?
答案 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图像并将它们转换成特征向量,并行成本只需几分钟。
总而言之,并行加载和处理数据并将结果保存在数据库(如果很大)的内存中(如果很小)。