【发布时间】:2011-04-20 19:43:28
【问题描述】:
我需要合并大约 30 个 gzip-ed 文本文件,每个压缩后大约 10-15GB,每个包含多行记录,每个记录按相同的键排序。这些文件位于 NFS 共享上,我可以从多个节点访问它们,并且每个节点都有自己的 /tmp 文件系统。最快的方法是什么?
一些可能的解决方案:
A.把它全部留给sort -m。为此,我需要通过awk/sed/grep 传递每个输入文件,以将每条记录折叠成一行并提取sort 可以理解的键。所以我会得到类似的东西
sort -m -k [...] <(preprocess file1) [...] <(preprocess filen) | postprocess
B.查看python的heapq.merge。
C.编写我自己的 C 代码来执行此操作。我可以小批量合并文件,为每个输入文件创建一个 OMP 线程,一个用于输出,一个实际在 RAM 中进行合并,等等。
以上所有选项:
D.在锦标赛中一次合并几个文件。
E.为此使用多个节点,在节点之间复制中间结果。
你会推荐什么?我没有太多关于二级存储效率的经验,因此,我发现很难估计其中任何一个的性能。
【问题讨论】:
-
您是否考虑过更接近问题的根源?例如。如果您的文本文件是面向行而不是面向记录(多行)创建的,您可能无需预处理即可执行合并排序。
标签: sorting merge large-files