大容量ファイルのためにgzipに「cat」をパイピングするよりもリソース集約的ではない代替

大容量ファイルのためにgzipに「cat」をパイピングするよりもリソース集約的ではない代替

いくつかのファイルがありますが、そのうちのいくつかは非常に大きいので(数GB)、それを1つの大きなファイルにリンクしてから圧縮する必要があります。これを行うことができます。

cat file1 file2 file3 file4 | gzip > compress.gz

これにより、システムに非常に高いCPUとメモリ負荷が発生する可能性があり、ギガバイトのメモリがcat生成されるとシステムがクラッシュする可能性があります。

tarアーカイブは利用できず、実際には大きな塊をgzipする必要があります。

catまず、いくつかのGBを使用する必要はありませんが、すべてのファイルが同じ.gzにあるように、同じgzファイルを順番に作成するにはどうすればよいですか?

答え1

catかなりのCPU時間(ディスク上の復号化、解凍、およびcatディスクから読み取られるプロセス計算を除く)やメモリを使用しないでください。ただファイルの内容を読み、それを小さな塊としてループのパイプに書き込みます。

しかし、ここでは必要ありません。次のことができます。

gzip -c file1 file2 file3 file4 > compress.gz

(大きな影響はありません。)

このコマンドを使用してプロセスの優先順位を下げることができますgzip(CPUスケジューリング関連)nice。一部のシステムには、ioniceI/O と同じコマンドがあります。

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

gzip並列バージョンは、システムにできるだけ少ない影響を与えながらLinuxで実行されます。

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]

関連情報