Memory

將“cat”管道傳輸到 gzip 以獲取大文件的資源消耗較少的替代方案

  • November 14, 2014

我有一些文件非常大(比如幾個 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不同的磁碟上(如果使用旋轉儲存)會提高效率。

如果系統有可用的記憶體,則係統可以在記憶體中記憶體catgzip/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

引用自:https://unix.stackexchange.com/questions/167929