1

約500万行のデータベースがあります。データベース用の XML 文字列を生成してサービスにプッシュしようとしています。これを一度に 1 つずつ行う代わりに、サービスは一度に 1000 レコードの取得をサポートします。現時点では、これは非常に遅く、1000 レコードあたり 10 秒以上かかります (データベースへの書き込みとサービスへのアップロードを含む)。

次のコードを機能させようとしましたが、失敗しました...試してみるとクラッシュします。何か案は?

    var data = <insert LINQ query here>
    int take = 1000
    int left = data.Count();

    Parallel.For(0, left / 1000, i =>
        {
            data.Skip(i*1000).Take(1000)...
            //Generate XML here.
            //Write to service here...
            //Mark items in database as generated.
        });
        //Get companies which are still marked as not generated.
        //Create XML.
        //Write to Service.

インデックスが範囲外であることを示すクラッシュが発生します。が 500 万の場合left、ループ内の数は 5000 を超えないようにする必要があります。これに 1000 を掛けても、500 万を超えることはありません。少しの間は機能し、その後失敗してもかまいませんが、SQL クエリの後で失敗するだけです。

4

2 に答える 2

3

最後のインデックス値が気に入らないと思います-左/ 1000 -1にする必要があり、左/ 1000ではありません:

Parallel.For(0, left / 1000 - 1, i =>
        {
            data.Skip(i*1000).Take(1000)...
            //Generate XML here
            //Write to Service here...
            //mark items in DB as generated
        });
于 2011-02-03T17:36:15.467 に答える
2

index out of bounds エラーは、現在表示されているコード以外のコードが原因であると思われます。

そうは言っても、これははるかにクリーンな方法で処理できます。このアプローチを使用する代わりに、カスタム パーティショナーの使用に切り替えることを検討する必要があります。Skip/Take を呼び出すたびにシーケンスの再評価が強制されるため、これは劇的に効率的になります。

于 2011-02-03T17:36:51.457 に答える