Memory
將“cat”管道傳輸到 gzip 以獲取大文件的資源消耗較少的替代方案
我有一些文件非常大(比如幾個 GB),我需要將它們連接到一個大文件然後壓縮它,所以是這樣的:
cat file1 file2 file3 file4 | gzip > compress.gz
這會在機器上產生極高的 CPU 和記憶體負載,甚至使其崩潰,因為它會
cat
生成數 GB。我不能使用 tar 檔案,我真的需要一大塊用 gzip 壓縮的文件。
如何按順序生成相同的 gz 文件,這樣我就不必先創建
cat
幾個 GB,但最後仍然將所有文件放在同一個 .gz 中?
cat
不使用任何顯著的 CPU 時間(除非可能涉及磁碟上的解密或解壓縮,併計入cat
從磁碟讀取的程序)或記憶體。它只是讀取文件的內容並在循環中以小塊的形式將其寫入管道。但是,在這裡,您不需要它。你可以這樣做:
gzip -c file1 file2 file3 file4 > compress.gz
(並不是說它會產生重大影響)。
您可以使用該命令降低
gzip
程序的優先級(wrt 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