2011-04-20 56 views
1

我需要合并大约30个gzip-ed文本文件,每个文件大约压缩10-15GB,每个文件包含多行记录,每个记录都由同一个键排序。这些文件驻留在NFS共享中,我可以从多个节点访问它们,并且每个节点都有自己的/tmp文件系统。最快的方法是什么?有效合并排序文件

一些可能的解决方案:

A.一切交给sort -m。要做到这一点,我需要通过awk/sed/grep传递每个输入文件,将每条记录折叠成一行,并提取一个sort可以理解的密钥。所以,我会得到类似

sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess

B.瞧到蟒的heapq.merge。 C.编写我自己的C代码来做到这一点。我可以合并在小批量的文件,使一个OMP线程每个输入文件,一个用于输出,和一个实际上做在RAM中的合并等

选项上述所有的:

d 。在比赛中一次合并几个文件。 E.为此使用多个节点,在节点之间复制中间结果。

你会推荐什么?我对二级存储效率并没有太多经验,因此,我很难估计其中的哪一个会发挥作用。

+0

你有没有考虑过将问题更接近它起源的地方?例如。如果您的文本文件是面向行而不是面向记录(多行),那么您可以在不进行预处理的情况下执行合并排序。 – Jens 2011-08-26 12:25:44

回答

2

如果你去涉及heapq.merge解决方案B,那么你会很高兴知道的是Python 3.5将根据docs.python.orgbugs.python.orggithub.com添加key参数heapq.merge()。这将是您的问题的一个很好的解决方案。