複数のスレッドからgzip圧縮ファイルを読み込もうとしています。C++/C gzファイルを同時に読み取る複数のスレッド
gzread
複数のスレッド内の関数が(gseek
を使用して)異なるファイルオフセットから開始するため、ファイルのさまざまな部分を読み込むので、これにより解凍プロセスが大幅に高速化されると考えていました。
単純化されたコードは、驚いたことに
// in threads
auto gf = gzopen("file.gz",xxx);
gzseek(gf,offset);
gzread(xx);
gzclose(gf);
のようなものです、私のマルチスレッド版のプログラムは全くないスピードアップを行います。 20スレッドバージョンは、シングルスレッドバージョンとまったく同じ時間を使用します。私はこれがディスクのボトルネックから遠いと確信しています。
私は、zlibのインフレ機能が、小さな部分でもファイル全体を解凍する必要があるかもしれないと思っていますが、私はマニュアルから手がかりを得られませんでした。
誰かが私の場合にスピードアップする方法を知っていますか?
通常、ほとんどの時間はデータの読み取りに費やされます。減圧ではない。最も速い利用可能なメディアにあなたのデータを置き、もう一度やり直してください。 – GMichael
@GMichael手がかりをありがとう。私は、同じプログラムを2つの圧縮ファイルに対して実行しました.1つは600Mの圧縮レベルが高く、もう1つは低レベルですが2Gサイズです。最初のファイルは22秒、後者は10秒でした。したがって、圧縮解除の可能性が高くなります。 – fanbin
各スレッドで同じファイルハンドルを使用し、別々に開こうとしないでください –