【发布时间】:2016-07-11 03:22:22
【问题描述】:
我收到了几个 CSV 文件,我需要将它们合并到一个文件中,所有这些文件都有一个我可以用来加入它们的公共密钥。不幸的是,这些文件中的每一个都有大约 5 GB 大小(几百万行,大约 20-100+ 列),因此仅将它们加载到内存中并对每个文件执行连接是不可行的,但我知道我不必担心它们之间现有的列冲突。
我尝试为与每个 ID 对应的每个文件创建一个行索引,这样我就可以在不使用太多内存的情况下计算结果,但是当实际尝试查找每一行时,这当然会随着时间本身而变慢,拉行中的其余 CSV 数据,将其连接到进行中的数据,然后写入文件。这根本不可行,即使在 SSD 上,也无法针对每个文件中的数百万行进行处理。
我还尝试简单地将一些较小的集合加载到内存中并针对它们运行 parallel.foreach 以匹配必要的数据以转储回临时合并文件。虽然这比上一种方法快,但我根本没有内存来处理较大的文件。
理想情况下,我希望对最大的文件进行完全左连接,然后对每个后续较小的文件进行完全左连接,以便将它们全部合并。
否则我该如何解决这个问题?我在这个系统上有 24 GB 的内存可以使用,还有六个内核可以使用。
虽然这可能只是在关系数据库中加载并从那里进行连接的问题,但我想在走这条路之前我会先联系一下,看看是否有任何想法可以从我的本地解决这个问题系统。
谢谢!
【问题讨论】: