【发布时间】:2011-07-30 06:05:09
【问题描述】:
我有需要处理的大型 CSV 数据集(超过 1000 万行)。我还有另外两个文件需要在输出中引用——它们包含的数据放大了我们对 CSV 文件中数百万行的了解。目标是输出一个新的 CSV 文件,其中每条记录都与其他文件的附加信息合并。
假设大型 CSV 文件有交易,但客户信息和账单信息记录在另外两个文件中,我们想要输出一个新的 CSV,其中每笔交易都与客户 ID 和帐户 ID 等相关联。
一位同事有一个用 Java 编写的函数式程序来执行此操作,但速度很慢。原因是具有数百万行的 CSV 文件显然必须遍历很多很多次。
我的问题是——是的,我明白了——我应该如何在 Ruby 中解决这个问题?目标是让它更快(现在 18 多个小时,CPU 活动很少)
我可以将这么多记录加载到内存中吗?如果是这样,我该怎么做?
我知道这有点含糊。只是寻找想法,因为这对我来说有点新。
【问题讨论】:
-
您应该多写一些关于所需输出的内容。输入文件中的每一条记录是否必须只包含一条记录(行)(以及从辅助查找文件中匹配的一些新列)?为什么 CSV 必须“走很多次”?
-
正如两个(到目前为止)答案所说,数据库是一个很好的解决方案。 Postgres 或 MySQL 可以轻松处理这个问题,包括批量加载文件。他们会非常快速地导入数据,在您当前看到的 18 小时内,一旦数据进入数据库,他们就能够即时创建您的输出记录。 10+百万条记录对数据库来说不算什么。 :-)