【问题标题】:Sort lots of large compressed files对大量大型压缩文件进行排序
【发布时间】:2013-08-08 23:39:39
【问题描述】:

我有很多名为 xaa.gz、xab.gz、xac.gz 等的大型压缩文件。不幸的是,它们没有排序。我想做与以下等效的操作。

zcat x*|sort > largefile

split -l 1000000 largefile

然后 gzip 拆分的文件,并丢弃之前制作的所有其他文件。

问题是这会产生一个巨大的未压缩文件,然后是许多较小的未压缩拆分文件,然后再压缩它们。是否可以在不制作大文件的情况下完成整个操作,并且最好在压缩之前不保存拆分文件?

我有 8 个内核,所以我也想利用它们(我没有 coreutils 8.20,所以不能利用 sort --parallel)。

【问题讨论】:

  • 您要对单个文件进行排序还是将所有文件合并、排序、拆分?
  • 合并、排序、拆分。这就是我不太明白如何有效地做到这一点。
  • 您为什么对将文件分成块感兴趣?您不信任文件系统还是有一些未说明的原因?你知道sort CPU 将是这方面的主要成本,还是因为你可以过早地优化?
  • @msw 它们会很大,所以我想最终独立处理它们,以便处理阶段可以放入内存中。
  • 那么我建议您实际上是在可衡量的性能问题之前做出优化决策。 Linux 文件系统非常擅长确保在您尝试获取所需数据和预期需求时它们已经在内存中。如果您试图猜测您的性能瓶颈将是什么,那么您经常会出错,在这种情况下,您的“治愈”实际上可能不如您预期的疾病有效。

标签: bash sorting compression


【解决方案1】:

不是完整的代码,而是关于你可以在这里做什么的一些想法。

1) 对输入文件进行分区以并行处理:

num_cores=8
i=0
while read f; do
  part_name=part$i
  set $part_name="${!part_name} $f"
  (( i=(i+1)%num_cores ))
done < <(ls x*.gz)

2) 在不同进程中对部分文件进行解压和排序:

sort -m <(zcat $part0 | sort) <(zcat $part1 | sort) ...

3) 告诉 split 立即压缩文件:

... | split -l 1000000 --filter='gzip > $FILE.gz'

【讨论】:

    猜你喜欢
    • 2017-05-17
    • 2013-05-15
    • 2022-01-06
    • 1970-01-01
    • 2014-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多