1

現在、パイプライン設計のアプリケーションがあります。最初の段階では、いくつかのデータとファイルをストリームに読み込みます。データのストリームに何らかの処理を行う中間段階がいくつかあります。そして、ストリームをどこかに書き出す最終段階があります。これはすべて連続して発生し、1 つのステージが完了してから次のステージに引き継がれます。

これはすべてうまく機能していますが、データ量がかなり大きくなり始めています (数百 GB になる可能性があります)。そのため、これを緩和するために何かをする必要があると考えています。私の最初の考えは、私がフィードバックを探しているものです(独立した開発者であるため、アイデアを跳ね返す場所がありません)。

並列パイプラインを作成することを考えています。パイプラインから開始するオブジェクトは、すべてのステージを作成し、それぞれのステージを独自のスレッドで開始します。最初の段階でストリームが特定のサイズになると、そのストリームを次の段階に渡して処理し、独自の新しいストリームを開始して引き続きいっぱいになります。ここでのアイデアは、最初のステージが新しいストリームを構築しているため、最終ステージでストリームを閉じて、メモリ使用量を低く抑えるということです。

質問: 1) この設計の方向性についてのハイレベルな考えはありますか? 2) ここで適用できると考えられるより単純なアプローチはありますか? 3) このようなことをして再利用できるものはありますか (購入しなければならない製品ではありません)。

ありがとう、

マイクD

4

3 に答える 3

1

生産者/消費者モデルは、先に進むための良い方法です。また、Microsoft には新しいParallel Extensionsがあります。これにより、基本的な作業のほとんどが提供されます。Taskオブジェクトを調べます。.NET 3.5 / VS2008 で利用できるプレビュー リリースがあります。

最初のタスクは、ストリームからデータのブロックを読み取り、それを他のタスクに渡す必要があります。次に、論理的に収まる限り多くのタスクを中間に置きます。小さいタスクは (一般的に) 優れています。注意する必要があるのは、最後のタスクが読み取った順序でデータを保存することだけです (途中のタスクはすべて、開始した順序とは異なる順序で終了する可能性があるため)。

于 2009-11-19T02:56:02.520 に答える
0

各段階で、データのチャンク全体を読み取り、操作を行ってから、チャック全体を次の段階に送りますか?

その場合は、データのチャンク全体を次のステージにプッシュする「プッシュ」手法を使用しています。「プル」テクニックを使用して、マナーのようなより多くのストリームで物事を処理できますか?各ステージはストリームであり、そのストリームからデータを読み取ると、readを呼び出して前のストリームからデータをプルします。各ストリームが読み取られると、前のストリームから小さなビットで読み取り、処理して、処理されたデータを返します。宛先ストリームは、前のストリームから読み取るバイト数を決定し、大量のメモリを消費する必要はありません。これは、BizTalkのようなアプリケーションがどのように機能するかです。BizTalk Pipelineストリームがどのように機能するかについてのブログがいくつかありますが、それはまさにあなたが望むものかもしれないと思います。

これはあなたが面白いと思うかもしれないマルチパートのブログエントリです:

パート1
パート2
パート3
パート4
パート5

于 2009-11-19T05:19:29.267 に答える
0

あなたが提案したデザインについて、プロデューサー/コンシューマーの問題についてまだよく読んでいない場合は、よく読んでください。そのような状況でセマフォを使用する方法を十分に理解する必要があります。

試すことができる別のアプローチは、複数の同一のパイプラインを作成し、それぞれを別のスレッドにすることです。これは、スレッド間通信がはるかに少ないため、おそらくコーディングが簡単です。ただし、データによっては、この方法でチャンクに分割できない場合があります。

于 2009-11-19T01:50:25.127 に答える