大容量ファイルのために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

おすすめ記事