ファイルを1行ずつ読み取るC ++アプリケーションを作成しました。 1行を読んで処理し、次の行を読みます。
私はgzip圧縮ファイルのサポートを追加し、C ++解凍ライブラリを使用する代替案を探しています。 1つの解決策は、ファイル全体を解凍し、通常どおりに読むことです。
zcat
しかし、私は非常に大きなファイルを扱っていますが、ファイルの最初の行をすぐに解凍して、迅速な開始時間を持つことを好みます。問題は、選択されていないままにzcat
しておくと、私のアプリケーションが追いつくことができないほどファイルの圧縮が早すぎます。です。
zcat
一時停止するか、一度に1行ずつ読み、ユーザーが指示したときにのみ進むように指示できますか?
答え1
以下はマニュアルページで引用されました。パイプ(7)。
パイプ容量
パイプラインの容量は制限されています。パイプがいっぱいになると、write(2)はO_NONBLOCKフラグが設定されているかどうかに応じてブロックまたは失敗します(下記参照)。実装ごとにパイプライン容量の制限が異なります。アプリケーションは特定の容量に依存してはいけません。アプリケーションは、読み取りプロセスでデータが利用可能になるとすぐに、それを使用して書き込みプロセスがブロックされたままにならないように設計する必要があります。
2.6.11より前のLinuxバージョンでは、パイプ容量はシステムページサイズ(たとえばi386の4096バイト)と同じでした。 Linux 2.6.11以降、パイプ容量は65536バイトです。
このパイプには特定の容量がありますが、最新のLinuxカーネルではおそらく64kです。その容量に達すると、読み取り呼び出し後にスペースが使用可能になるまですべての書き込みがブロックされます。したがって、通常、zcat your_file.gz | your_program
特定の時間に圧縮されていないファイルは64kしかないため、メモリ使用量を心配する必要はありません。
答え2
アプリケーションがファイルを読み取るだけでファイルを読み取らないように設定されている場合は、stdin
プロセス置換を使用できます。これはパイプのように機能しますが、シェルはそれをアプリケーションにファイルとして提供します。ほとんどの最新のシェルはこの機能を提供しますが、POSIXはそうではありません。例は次のとおりです。
yourscript <(zcat filename)
答え3
あなたはそれを使用することができますPVzcatに送信された速度制限データ。
pv -L 5k -q < test.gz | zcat