1

たくさんのファイルを解析する必要があります。だから今、私はコンテンツを読み取り解析し、別の場所に出力を書き込むためにファイルを開きます。それは基本的に私がする必要があることですが、私は14000ファイルを解析しているので、プロセスをスピードアップしたいと思います。

作業を複数のスレッドに分割することで、アルゴリズムを改善しました。したがって、1つのスレッドにファイルの25%を実行させ、次の25%を実行させました。

とにかく、次のような場合は、パフォーマンスと速度が劇的に向上すると思います。

  1. Task 1ファイルを読み取り、ファイルの内容を BlockingCollection1(メモリ)に配置します
  2. Task 2BlockingCollection1のコンテンツを解析し、解析されたデータを配置するための複数のスレッドを作成しますBlockingCollection2
  3. Task 3コンテンツをディスクから読み取りBlockingCollection2、ディスクに書き込みます。

私が今抱えている問題は、メモリ不足の例外が発生することです。使用されている場合は、ガベージコレクターにBlockingCollection1からアイテムを削除させたいと思います。BlockingCollection2また、ディスクに書き込まれているアイテムを削除したいと思います。

BlockingCollection<T>1つのスレッドがそのコレクションにアイテムを追加し、別のスレッドがそれらのアイテムを処理できるため、使用すると非常に便利です。リンクリストを使用する前に、この質問に傾倒しました:https ://stackoverflow.com/a/12519345/637142BlockingCollectionがどのようにエッセイと有用であるか。 とにかく、どうすればこの問題を解決できますか?スタックなど、別の種類のコレクションを使用する必要がありますか?

4

1 に答える 1

3

インスタンスを作成するときに、境界容量BlockingCollection<T>を受け入れるコンストラクターを使用できます。これにより、一度に多くのアイテムをコレクションに入れることができなくなり、「生成された」アイテムの数を調整して、消費されたアイテムの数と一致させることができます。

これを抑制したままにしておくと、アイテムをディスクに書き込むよりも速く処理されないため、すべてのメモリを使用できなくなる可能性があります。

于 2012-09-28T21:10:26.240 に答える