1

大きな圧縮CSVファイルを複数の小さなgzipファイルに分割し、行の境界で分割したいと思います。

LINEをしばらく読んでgunzipをbashスクリプトにパイプしようとしています。そのスクリプトは、バックグラウンドのgzipプロセスがそれを再圧縮している名前付きパイプに書き込みます。X文字を読み取るたびに、FDを閉じて、次の分割のために新しいgzipプロセスを再開します。

ただし、このシナリオでは、LINEの読み取り中にスクリプトがCPUの90%を消費します。これは、読み取りが非常に非効率的であるためです(一度に1文字を読み取るためにシステムコールを実行することを理解しています)。

これを効率的に行うことについて何か考えはありますか?gzipが大部分のCPUを消費すると思います。

4

2 に答える 2

2

オプションとともに使用splitして、-l必要な行数を指定します。使用--filterオプション$FILEは、ファイルへの出力にsplitが使用する名前です(シェルによる展開が早すぎるのを防ぐために、一重引用符で囲む必要があります。

zcat doc.gz | split -l 1000 --filter='gzip > $FILE.gz'

追加の処理が必要な場合は、ファイル名を引数として受け入れ、それに応じて標準入力を処理するスクリプトをペンで入力し、プレーンの代わりにそれを使用しますgzip

于 2012-12-07T16:36:21.007 に答える
0

オプション付きsplitのコマンドを使ってみませんか?-l

gzcat large.csv.gz | split -l 1000 - xxx
gzip xxx*
于 2012-12-07T16:41:07.553 に答える