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

33 投票
8 回答
5766 浏览
提问于 2025-04-15 23:20

我有大量的数据(几TB),而且还在不断增加……这些数据存储在很多用制表符分隔的文本文件中(每个大约30MB)。大部分工作都是读取这些数据,然后根据一系列条件对观察值/行进行汇总(比如求和、求平均和其他一些转换),最后把结果保存成文本、HDF5或SQLite文件等。我通常用R来处理这些任务,但我担心这可能会有点大。现在有几个可能的解决方案:

  1. 把整个程序用C语言(或者Fortran)写出来
  2. 直接把文件(表格)导入到关系数据库中,然后再用R或Python提取部分数据(有些转换不太适合用纯SQL来解决)
  3. 把整个程序用Python写出来

选择(3)会是个坏主意吗?我知道可以在Python中调用C语言的程序,但在这种情况下,因为没有什么计算上特别复杂的任务(比如需要很多次迭代计算的优化程序),我觉得输入输出的速度可能和计算本身一样成为瓶颈。你有什么建议或者其他考虑的事项吗?谢谢

编辑 感谢大家的回复。关于Hadoop的看法似乎有些矛盾,但无论如何我没有访问集群的权限(不过我可以使用几台没有联网的机器)……

8 个回答

6

看看这个Disco。它是一个轻量级的分布式MapReduce引擎,代码大约有2000行,是用Erlang语言写的,但特别为Python开发设计的。它不仅可以处理你的数据,还能可靠地存储和复制数据。最近他们刚发布了0.3版本,新增了索引和数据库层的功能。

14

好吧,那我们来聊聊为什么不试试R语言呢?

  • 你似乎对R语言有一定了解,这样你可以更快地写出可用的代码。
  • 每个文件30MB在普通的工作站上并不算大,几GB的内存完全可以应付。
  • 使用read.csv()这个函数的变种read.table()时,如果你通过colClasses参数指定列的类型,会非常高效:这样就不用猜测数据类型,处理起来会更顺畅。
  • 这里的瓶颈主要是磁盘的输入输出,这在任何编程语言中都是一样的。
  • R语言有一个叫做multicore的功能,可以在多核机器上进行并行处理(听起来和Python的多进程处理类似)。
  • 如果你想利用这个问题的“非常适合并行处理”的特点,R有几个包非常适合处理数据并行的问题:比如snowforeach,它们可以在一台机器上使用,也可以在一组联网的机器上运行。
14

(3) 其实并不是个坏主意——Python 处理“CSV”文件很简单(尽管 CSV 中的 C 代表逗号,但用制表符作为分隔符也同样容易处理),而且在输入输出操作方面,它的性能和其他语言差不多。至于其他推荐,numpy 除了能快速计算(根据你的说法,你可能不需要这个),还提供了非常方便、灵活的多维数组,这对你的任务可能会很有帮助;而标准库中的 multiprocessing 模块可以让你利用多核处理器来完成那些容易并行处理的任务(这很重要,因为现在几乎每台机器都有多个核心;-)。

撰写回答