0

データベースにインポートするデータがたくさんあります。

これらのデータには、処理、ろ過、結合などが必要です。したがって、開始前にすべてのテーブルを実行し、最後まですべてのオブジェクトを保存して、すべてがオブジェクトで行われます。

すべての処理が完了したら、コマンドを実行して保存します。時間がかかりすぎています。別のアプローチを実践することを考えました:

Task.Factory.StartNew(() =>
        {
            while (allCSV.Length % 4 != 0)
            {
                Save(allCSV.FirstOrDefault());
                allCSV = allCSV.Skip(1).ToArray();
            }
            int count1 = 0;
            int middle = allCSV.Length / 4;
            int count2 = middle;
            int count3 = middle * 2;
            int count4 = middle * 3;
            Parallel.For(0, 4, new Action<int>((i) =>
            {
                switch (i)
                {
                    case 0:
                       for (int j = 0; j < middle; j++)
                       {
                         Save(allCSV[count1]);
                         count1++;
                       }
                    break;
                    case 1:
                       for (int k = 0; k < middle; k++)
                       {
                         Save(allCSV[count2]);
                         count2++;
                       }
                    break;
                    case 2:
                       for (int l = 0; l < middle; l++)
                       {
                         Save(allCSV[count3]);
                         count3++;
                       }
                    break;
                    case 3:
                       for (int m = 0; m < middle; m++)
                       {
                         Save(allCSV[count4]);
                         count4++;
                       }
                    break;
                 }
              }
          }

それは正しいでしょうか?プロセスを合理化する最善の方法は何ですか?

いくつかの考慮事項、使用されているコンピューターは最新世代です。データベースはMySQLです。

保存に使用される ORM は非常に単純で、最適化は一切行われていません。

4

2 に答える 2

3

一度に複数のテーブルへの挿入を実行できない限り、アプリケーションのマルチスレッド化は役に立ちません。SQLServerでこの問題が発生しました。挿入/更新は非常に多くのことを行っていたため、長い時間がかかり、すべてがアトミックである必要があったため、1回の挿入/更新でテーブル全体がロックされました。mySQLがテーブルレベルのロックをより適切に処理するかどうかはわかりませんが、疑わしいです。

最善の策は、データベース中心のソリューションを検討することかもしれません。トランザクション、一括挿入、ETLなどを実行することは、C#コードを作成するよりもはるかに優れたソリューションになる可能性があります。

于 2012-08-15T22:18:45.270 に答える
2

あなたはそれを過度に複雑にしているようです。しません

Parallel.ForEach(allCsv, Save);

もっと簡単に?

もちろん、操作を並列化することでパフォーマンス上の利点が得られるかどうかは議論の余地があります。

于 2012-08-15T21:35:10.543 に答える