4

mmap/read + BZ2_bzDecompress を使用して、大きなファイル (29GB) を順次解凍しています。これは、圧縮されていない xml データを解析する必要があるが、必要なのはそのほんの一部であり、ファイル全体 (400GB の非圧縮) を圧縮解除してから解析するよりも、順次実行する方が効率的であるように思われたためです。興味深いことに、すでに解凍部分は非常に遅いです。シェル コマンド bzip2 は 1 秒あたり 52MB を少し超える速度で実行できますが (いくつかの実行を使用しtimeout 10 bzip2 -c -k -d input.bz2 > output、生成されたファイル サイズを 10 で割った値です)、私のプログラムは 2MB/s でさえ実行できません。数秒後に 1.2MB/s まで遅くなります

処理しようとしているファイルは複数の bz2 ストリームを使用しているため、 をチェックしBZ2_bzDecompressBZ_STREAM_ENDいます。それが発生した場合は、ファイルが完全に処理されていない場合に備えて、次のストリームで再開します。私もなしで試しましたが、何も変わりませんでした(そして、ドキュメントでは、複数のストリームを正しく処理する方法を実際に見ることはできません)BZ2_bzDecompressEnd( strm );BZ2_bzDecompressInit( strm, 0, 0 )BZ2_bzDecompressEnd

ファイルは以前にmmapされていましたが、フラグのさまざまな組み合わせも試しました.現在MAP_RDONLY、 madviseを使用しています(戻り値をチェックしていますが、madviseは問題を報告しません.Linuxカーネル3.2x debianを使用していますhugepage をサポートするセットアップ)MAP_PRIVATEMADV_SEQUENTIAL | MADV_WILLNEED | MADV_HUGEPAGE

プロファイリングの際、速度を測定するためのいくつかのカウンターと、n回の反復ごとに1回に制限されたprintf以外は何も実行されていないことを確認しました. また、これは、他のすべてのコアがアイドル状態の最新のマルチコア サーバー プロセッサ上にあり、仮想化されていないベア メタルです。

私が間違っている可能性がある/パフォーマンスを向上させるために何をすべきかについてのアイデアはありますか?

更新: James Chong の提案のおかげで、 と「交換」mmap()してみread()ましたが、速度は同じです。だから、それmmap()は問題ではないようです(それ、または根本的な問題mmap()read()共有しています)

更新 2: おそらく bzDecompressInit/bzDecompressEnd で行われた malloc/free 呼び出しが原因ではないかと考えて、bz_stream 構造体の bzalloc/bzfree をカスタム実装に設定しました。設定します (不透明パラメーター = strm.opaque によって渡されます)。完全に正常に動作しますが、やはり速度は向上しませんでした。

更新 3: read() の代わりに fread() も試しましたが、それでも速度は変わりません。また、さまざまな量の読み取りバイトと解凍データバッファーのサイズを試しましたが、変化はありませんでした。

更新 4: mmap() だけを使用してシーケンシャル読み取りで約 120MB/秒に近い速度を達成できたので、読み取り速度はまったく問題ではありません。

4

1 に答える 1

1

スワッピング、mmap フラグはほとんど関係ありません。bzip2 が遅い場合、それはファイル I/O が原因ではありません。

libbz2 が完全に最適化されていないと思います。あなたが想像できる最も残忍な gcc フラグで再コンパイルしてください。

私の 2 番目のアイデアは、ELF リンクのオーバーヘッドがあるかどうかということでした。この場合、bz2 で静的にリンクすると問題はなくなります。(その後、動的にロードされた libbz2 でこれを高速化する方法を考えることができます)。

将来からの重要な拡張: Libbz2再入可能で、スレッドセーフで、位置に依存しない必要があります。これは、さまざまな C フラグを使用してコンパイルすることを意味し、これらのフラグはパフォーマンスに良い影響を与えません (ただし、はるかに高速なコードが生成されます)。極端なケースでは、シングルスレッド、非 PIC、非再入可能バージョンと比較して、5 倍から 10 倍遅くなると想像することさえできます。

于 2013-11-19T21:11:35.460 に答える