【问题标题】:Merge sorted files efficiently有效地合并排序的文件
【发布时间】: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


【解决方案1】:

如果您选择涉及heapq.merge 的解决方案B,那么您会很高兴地知道,Python 3.5 将根据docs.python.orgbugs.python.org 和@向 heapq.merge() 添加一个key 参数987654323@。这将是解决您问题的好方法。

【讨论】:

    猜你喜欢
    • 2019-10-29
    • 2020-12-28
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    相关资源
    最近更新 更多