0

2,800,000レコードのAccessDatabaseを更新する大きなループがあります。ループを7つのスレッドに分割して、各スレッドが400,000レコードで機能するようにします。計算がたくさんあるため、ループは1つのレコードを更新するのに約0.7秒かかります。

7200RPM HDDとSSDおよびRAMディスクでアプリケーションをテストし、速度の違いはそれほど目立たないため、IOがボトルネックではないため、スレッドがプロセスを大幅に高速化するのに役立つと確信しています。

最初のスレッドで最初の400kレコードを処理し、2番目のスレッドで次の400kレコードを処理するようにします。

-これを行う正しい方法は何でしょうか?

-各スレッドには独自のデータテーブルとバインディングソースが必要ですか?

-結果を1つのテーブルにまとめて、プロセスが完了したときにdatagridviewに表示するにはどうすればよいですか?

4

2 に答える 2

1

アクセスデータベースは単なるファイルです。読み取りと書き込みの時点で、ボトルネックになります。さらに、このようなことを行うと、破損する可能性が高くなります。データのxmlファイルで同じことを行うことを想像してみてください。

すべては、データに対して何をしているかによって異なります。キーまたはインデックスの列に変更がなく、すべてのレコードが読み取られたり変更されたりするわけではない場合。次に、読み取りと書き込みを行う1つのスレッドと、処理するプールがどこかに到達する可能性があります。ただし、処理は、複数のスレッドをスピンアップする価値があるようにするために十分に重要である必要があります。かなりの量がない限り、ディスクIOで待機することになります。変更されるインデックスがあり、操作でそれらを使用する必要がない場合。それらをドロップし、処理してから、元に戻します。

データに大幅な変更を加える場合は、多分

既存のデータベースからの1つの読み取りスレッド次に、このテーブルだけを含む7つの空のデータベースを作成します(適切な数のプロセッサに基づいてこれを調整する場合があります)。親から読み取り、プロセッサプールにスローします(1つ持つ価値がある場合) 、次に「7つの」コピーの1つに書き込みます。次に、元のコピーをクリアして、他のコピーからデータを書き戻します(連続して元に戻します)。

ドロップアクセスとはすべて、完全なDBMSを使用します。これは、予想していた改善の一部が見られた可能性があるためです。

並列処理の際に留意すべき点。ボトルネックはどこにありますか?あなたの場合、おそらくディスクIOであり、複数のスレッドがそれに対処していなかったため、7つのスレッドがディスクドライブを待っている親指をいじくり回してしまいました。

于 2012-08-11T12:49:00.133 に答える
1

これを別の角度から攻撃することをお勧めします。この多くのレコードをループして個別に変更すると、常に時間がかかります。

一度に多くのレコードを更新する更新ステートメントを発行し、論理ステートメントに分割してビジネスロジックをカプセル化することをお勧めします。例えば:

UPDATE stock SET retail = 0.95 WHERE retail  < 1.5
UPDATE stock SET retail = 1.95 WHERE retail >= 1.5 and retail < 2.5
UPDATE stock SET retail = 2.95 WHERE retail >= 2.5 and retail < 3.5
UPDATE stock SET retail = 3.95 WHERE retail >= 3.5 and retail < 4.5
UPDATE stock SET retail = 4.95 WHERE retail >= 4.5 and retail < 5.5

ビジネスロジックを個別のステートメントに分割できる場合は、一度に多くのレコードを大幅に高速に更新できます。

それができない場合は、可能であればもう少し詳細を投稿してください。

于 2012-08-13T03:08:54.080 に答える