我有一些文件,其中一些文件非常大(例如几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]