将“cat”管道传输到 gzip 中以获取大文件的资源消耗较少的替代方案

将“cat”管道传输到 gzip 中以获取大文件的资源消耗较少的替代方案

我有一些文件,其中一些文件非常大(例如几GB),我需要将其连接到一个大文件然后将其压缩,所以像这样:

cat file1 file2 file3 file4 | gzip > compress.gz

这会在机器上产生极高的 CPU 和内存负载,甚至导致机器崩溃,因为会cat产生数 GB 的内存。

我不能使用 tar 档案,我真的需要用 gzip 压缩一大块。

如何以顺序方式生成相同的 gz 文件,这样我就不必先使用cat几 GB,但最终仍将所有文件放在同一个 .gz 中?

答案1

cat不使用任何重要的 CPU 时间(除非可能涉及磁盘上解密或解压缩并计入cat从磁盘读取的进程)或内存。它只是读取文件的内容并将其以小块的形式循环写入管道。

然而,在这里,你不需要它。你可以这样做:

gzip -c file1 file2 file3 file4 > compress.gz

(并不是说它会产生重大影响)。

您可以使用该命令降低进程的优先级gzip(关于 CPU 调度)nice。某些系统具有ionice与 I/O 相同的命令。

nice -n 19 ionice -c idle pigz -c file1 file2 file3 file4 > compress.gz

在 Linux 上将运行并行版本,gzip对系统的影响尽可能小。

位于compress.gz不同的磁盘上(如果使用旋转存储)会提高效率。

如果系统有可用的内存,则可以将读取cat或读取的数据缓存在内存中。gzip/pigz如果您再次需要该数据,它就会这样做。在此过程中,它可能会驱逐其他更有用的缓存数据。在这里,这些数据可能不需要可用。

使用 GNU dd,您可以使用iflag=nocache建议系统不要缓存数据:

for file in file1 file2 file3 file4; do
  ionice -c idle dd bs=128k status=none iflag=nocache < "$file"
done | nice pigz > compress.gz

答案2

如果您想在不使用太多资源的情况下延长进程,请尝试通过更改值来修改调度优先级nice

nice -n 19 cat file1 file2 file3 file4 | gzip > compress.gz  

男人很好

  -n, --adjustment=N
         add integer N to the niceness (default 10)

您还可以调节 gzip 速度,这可能值得研究(--best

还可以使用其他方法,但会将文件分开:

如果您乐意使用tar存档格式,那么您可以使用zip参数来动态压缩内容,但是,这些可能会使处理速度保持在较高水平:

tar zcvf compress.tgz file[1234]

或者您可以使用zip它可以处理多个文件:

zip compress.zip file[1234]

相关内容