さまざまな種類のメッセージを読み取ってカウントし、10 GB のテキスト ファイル ( FIXエンジン ログなど) でいくつかの統計を実行する必要があります。Linux、32 ビット、4 CPU、Intel、Perl でのコーディングを使用していますが、言語はそれほど重要ではありません。
Tim Bray の WideFinder プロジェクトで興味深いヒントを見つけました。ただし、メモリ マッピングの使用は、32 ビット アーキテクチャによって本質的に制限されることがわかっています。
複数のプロセスを使用してみましたが、4 つの CPU で 4 つのプロセスを使用してファイルを並列処理すると、より高速に動作するようです。マルチスレッドを追加すると、おそらくコンテキスト切り替えのコストが原因で速度が低下します。スレッドプールのサイズを変更してみましたが、それでも単純なマルチプロセス版より遅いです。
メモリ マッピング部分はあまり安定していません。2 GB のファイルで 80 秒かかることもあれば、7 秒かかることもあります。とにかく、Mmap は 32 ビット アーキテクチャで 4 GB を超えて拡張することはできません。
Perl のIPC::MmapとSys::Mmapを試しました。Map-Reduce も調べましたが、問題は実際には I/O バウンドであり、処理自体は十分に高速です。
そこで、バッファリングのサイズやタイプなどを調整して、基本的な I/O を最適化することにしました。
この問題が任意の言語/プラットフォームで効率的に解決された既存のプロジェクトを知っている人は、有用なリンクを示したり、方向性を提案したりできますか?