我需要合并大约30个gzip-ed文本文件,每个文件大约10-15GB压缩,每个文件包含多行记录,每个记录按相同的键排序。这些文件驻留在NFS共享上,我可以从多个节点访问它们,每个节点都有自己的/tmp
文件系统。什么是最快的方式呢?
一些可能的解决方案:
一个。全部留给sort -m
。为此,我需要通过awk
/ sed
/ grep
传递每个输入文件,将每条记录折叠成一行并提取sort
可以理解的密钥。所以我会得到像
sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess
B中。查看python的heapq.merge
。
℃。编写我自己的C代码来执行此操作。我可以小批量合并文件,为每个输入文件创建一个OMP线程,一个用于输出,一个实际在RAM中进行合并等。
以上所有选项:
d。在锦标赛中一次合并几个文件。
电子。为此使用多个节点,在节点之间复制中间结果。
你会推荐什么?我没有太多关于二级存储效率的经验,因此,我发现很难估计其中任何一个如何执行。
答案 0 :(得分:2)
如果您选择涉及heapq.merge
的解决方案B,那么您将很高兴地知道,Python 3.5将根据docs.python.org向heapq.merge()添加key
参数,bugs.python.org和github.com。这将是解决您问题的绝佳方法。