【问题标题】:How to efficiently compress many small files to many small .tar.gz files with gzip? [closed]如何使用 gzip 有效地将许多小文件压缩成许多小的 .tar.gz 文件? [关闭]
【发布时间】:2019-05-04 04:13:50
【问题描述】:

我有数百万个 *.csv 小文件,我想用 gzip 对它们进行压缩。

用gzip逐个循环压缩是可以的,但是效率不够。

我想知道是否有一种方法可以有效地做到这一点?通过多处理或其他方式?

【问题讨论】:

  • 如果您为每个输入文件创建一个压缩文件,为什么要tar.gz 而不仅仅是.gztar 的整个point是将多个输入文件一起归档到一个流中。
  • 也就是说,如果您关心效率,我根本不会为此目的使用 gzip。选择一种文件格式,让您使用预先构建的共享压缩表,在压缩大量小文件时,您将获得更好的比率;参见例如zstd
  • 也就是说,如果您的目标只是为了避免每个文件启动一次 gzip 的低效率,find . -type f -name '*.csv' -exec gzip -- {} + 将传递尽可能多的文件名给gzip 的每个副本,以适合命令行。
  • 将它们全部放在一个 .tar.gz 文件中。这将为所有这些组合使用单个 LZW 压缩表,这应该会产生更有效的压缩。如果您真的希望它们在单独的文件中,请使用 GNU Parallel 并行运行 gzip。
  • 查看上面的 Charles 的 cmets 并在此处查看...stackoverflow.com/a/34166037/2836621

标签: python linux shell gzip tar


【解决方案1】:

按照Charles Duffy's comment使用zstd

cd csvdir  # go to where the million .csv files are
zstd --train `find . -name '*.csv' | shuf -n 100`
mv dictionary csv.dict
zstd -T$(nproc) -9 -D csv.dict -o csvfiles.zstd *.csv

这会从一百个 .csv 文件的随机样本中创建一个字典,然后使用所有 CPU 内核将这百万个文件有效地压缩为 csvfiles.zstd

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-11
    • 2013-04-27
    • 2011-03-29
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    • 2011-07-28
    • 2021-08-07
    相关资源
    最近更新 更多