1

さて、私は何をどのようにすべきかについて少し混乱しています。私は並列プログラミングとスレッド化の理論を知っていますが、私の場合は次のとおりです。

特定のフォルダに多数のログ ファイルがあります。これらのログ ファイルをデータベースで読み取ります。通常、これらのファイルの読み取りには数時間かかります。シリアル方式で行うためです。つまり、各ファイルを反復処理し、次に各ファイルの SQL トランザクションを開いてログをデータベースに挿入し、次に別のファイルを読み取って同じことを行います。

現在、CPU のすべてのコアを消費できるように並列プログラミングを使用することを考えていますが、各ファイルにスレッドを使用するかどうかはまだ明確ではありません。システムに違いはありますか? つまり、たとえば 30 個のスレッドを作成した場合、それらはシングル コアで実行されますか、それとも Parallel で実行されますか? どうすれば両方を使用できますか?彼らがまだそれをしていない場合は?

編集:私は、10K HDD 速度、4 コア CPU、4 GB RAM、ネットワーク操作なしのシングル サーバーを使用しています。SQL Server は、OS として Windows 2008 と同じマシン上にあります。[それが役立つ場合はOSを変更できます:)]。

EDIT 2:あなたのフィードバックに基づいて確認するためにいくつかのテストを実行します.4 GB RAMを搭載したi3クアッドコアCPUで見つけたものは次のとおりです

  1. CPU1 は 24 ~ 50% のまま、CPU2 は 50% 未満のまま、CPU3 は 75% のまま、CPU4 は約 0% のままです。はい、Visual Studio、eamil クライアント、および他の多くのアプリケーションを開いていますが、これは、CPU4 が 0% のままであるため、アプリケーションがすべてのコアを使用していないことを示しています。

  2. RAM は常に 74% のままです [テスト前は約 50% でした]。これが読み取りの設計方法です。だから、心配することは何もありません

  3. HDD は読み取り/書き込みのまま、または使用値は 25% 未満のままであり、SQL トランザクションが最初にメモリに格納され、メモリがしきい値に達したときにディスクに書き込むため、正弦波で 25% に急上昇します。

ここではすべてのリソースが十分に活用されていないため、作業を分散して効率化できると思います。あなたの考えをもう一度。ありがとう。

4

6 に答える 6

2

この質問に対する明確な答えはありません。私のコメントで述べたように、テストする必要があります。

  • ボトルネックがディスク I/O である場合、スレッドを追加しても多くは得られず、ディスクへのアクセスを取得するために競合するスレッドが増えるため、パフォーマンスがさらに低下する可能性があります。

  • ディスク I/O は問題ないと思われるが、CPU 負荷が問題である場合は、いくつかのスレッドを追加できますが、ここでもコンテキストの切り替えにより状況が悪化するため、コアの数を超えることはありません。

  • より多くのディスクおよびネットワーク I/O を実行でき、CPU 負荷が高くない (可能性が非常に高い) 場合は、コアよりも (はるかに) 多くのスレッドでオーバーサブスクライブできます: 通常、スレッドがデータベースの待機に多くの時間を費やしている場合

したがって、最初にプロファイルを作成してから (急いでいる場合は直接) さまざまな構成をテストする必要がありますが、3 番目のケースになる可能性があります。:)

于 2013-06-18T11:13:14.677 に答える
2

まず第一に、コードを理解し、なぜ遅いのかを理解する必要があります。「私のコードは遅くて 1 つの CPU しか使用しないので、4 つの CPU をすべて使用するようにすれば 4 倍速くなる」などと考えている場合は、おそらく間違っています。

複数のスレッドを使用することは、次の場合に意味があります。

  1. コード (または少なくともその一部) は CPU バウンドです。つまり、ディスク、ネットワーク接続、またはデータベース サーバーによって速度が低下するのではなく、CPU によって速度が低下します。
  2. または、コードに複数の部分があり、それぞれが異なるリソースを使用しています。たとえば、ある部分はディスクから読み取り、別の部分はデータを変換します。これには大量の CPU が必要で、最後の部分はデータをリモート データベースに書き込みます。(これを並列化するのに実際には複数のスレッドは必要ありませんが、通常はこれが最も簡単な方法です。)

あなたの説明から、あなたは状況 2 にいる可能性があるように思えます。これに対する適切な解決策は、プロデューサー コンシューマー パターンです。ステージ 1 スレッドは、ディスクからデータを読み取り、それをキューに入れます。ステージ 2 スレッドは、キューからデータを取得して処理し、別のキューに入れます。ステージ 3 スレッドは、処理されたデータを 2 番目のキューから取得し、データベースに保存します。

.Net 4.0 ではBlockingCollection<T>、スレッド間のキューに使用します。そして、「スレッド」と言うとき、私はほとんどを意味しTaskます. .Net 4.5 では、スレッドの代わりに TPL Dataflow のブロックを使用できました。

このようにすると、最大 3 倍高速に実行できます (各ステージに同じ時間がかかる場合)。ステージ 2 が最も遅い部分である場合、そのステージに複数のスレッドを使用することで、別のスピードアップを得ることができます (CPU バウンドであるため)。ネットワーク接続とデータベースによっては、同じことがステージ 3 にも適用される可能性があります。

于 2013-06-18T14:22:28.263 に答える
1

問題はすべての CPU を使用していないことです。アクションは主に I/O (ファイルの読み取り、DB へのデータの送信) です。

Thread/Parallel を使用すると、多くのファイルを同時に処理するため、コードの実行が高速になります。

あなたの質問に答えるために、フレームワーク/OS は、さまざまなコアでのコードの実行を最適化します。

于 2013-06-18T10:49:15.367 に答える
1

マシンによって異なりますが、一般的に言えば、デュアル コア プロセッサがあり、2 つのスレッドがある場合、オペレーティング システムは 1 つのスレッドを 1 つのコアに渡し、もう 1 つのスレッドを別のコアに渡します。使用するコアの数は関係ありません。重要なのは、方程式が最速かどうかです。並列プログラミングを利用したい場合は、論理的に意味のある方法でワークロードを共有する方法が必要です。また、ボトルネックが実際に発生している場所を考慮する必要があります。ファイルのサイズによっては、ストレージ メディアの読み取り/書き込みの最大速度に時間がかかっているだけかもしれません。テストとして、コード内で最も時間がかかっている場所をログに記録することをお勧めします。

非シリアル アプローチが役立つかどうかをテストする簡単な方法は、ファイルをある順序で並べ替え、同じジョブを同時に実行する 2 つのスレッド間でワークロードを分割し、違いがあるかどうかを確認することです。2 番目のスレッドが役に立たない場合は、OS がスレッドを前後に切り替えなければならないため、30 スレッドでも時間がかかるだけであることを保証します。

于 2013-06-18T10:50:10.687 に答える
1

まず、何が時間を取っているかを確認する必要があります。CPU が実際にボトルネックである場合は、並列処理が役に立ちます。多分それはネットワークであり、より高速なネットワーク接続が役立ちます. たぶん、より高速なディスクを購入すると役立つでしょう。

解決策を考える前に問題を見つけてください。

于 2013-06-18T10:47:35.860 に答える