2

フォルダーを再帰的に検索し、多数のファイルをスキャンする単純な部分文字列検索プログラムを作成しました。このプログラムは、Boyer-Moore-Horspool アルゴリズムを使用しており、大量のデータを非常に効率的に解析できます。

プログラムへのリンク: http://pastebin.com/KqEMMMCT

私が今やろうとしているのは、それをさらに効率的にすることです。コードを見ると、3 つの異なるディレクトリが検索されていることがわかります。各ディレクトリを同時に検索するプロセス/スレッドを作成できるようにしたいと考えています。これにより、プログラムが大幅に高速化されます。

これを実装する最良の方法は何ですか? 私はいくつかの予備調査を行いましたが、私の実装は成功していません。それらは 25 分程度の処理後に停止するようです (現在、単一プロセス バージョンの実行には 24 時間近くかかります。大量のデータがあり、648 個の固有のキーワードがあります)。

マルチプロセッシング API を使用してさまざまな実験を行い、さまざまなファイルすべてを 3 つのファイル (ディレクトリごとに 1 つ) に凝縮し、mmap() を介してファイルをメモリにマッピングしましたが、a: これが適切なルートかどうかわかりません。 b: 私のプログラムはランダムなポイントで停止し続け、デバッグは絶対的な悪夢でした。

はい、大規模なグーグル検索を行いましたが、プール/スレッド/サブプロセス/マルチスレッド/マルチプロセッシングの間でかなり混乱しています。

私はあなたに私のプログラムを書くように頼んでいるわけではありません.解決策を実装するために必要な思考プロセスを理解するのを手伝ってください. ありがとうございました!

参考までに: プログラムを実行したら、コードをオープンソース化する予定です。これは非常に便利なスクリプトだと思います。オンラインで入手できるマルチプロセッシングの実世界での実装例は限られています。

4

2 に答える 2

1

マルチプロセッシングは、マルチスレッド (IMO) よりも理解しやすく、使いやすいです。私の理由から、TAOUP のこのセクションを読むことをお勧めします。基本的に、スレッドやプロセスが行うことはすべて、プログラマーだけが OS が処理するすべてのことを行う必要があります。リソース (メモリ/ファイル/CPU サイクル) を共有していますか? スレッドのロック/ミューテックス/セマフォなどを学びます。プロセスを使用する場合、OS がこれを行います。

4 つ以上のプロセスを構築することをお勧めします。1 つはハード ドライブからデータを取得し、残りの 3 つは次のデータを取得するためにクエリを実行します。おそらく、すべてをくっつけるための 5 番目のプロセスです。

これは自然にジェネレーターに適合します。genfindの例と、それを使用するgengrepの例を参照してください。

また、同じサイトで、コルーチンのセクションをチェックしてください。

于 2012-04-11T17:42:57.340 に答える