2

RavenDBデータベースに大量のデータを挿入しています。約5002000レコード。それは可能な限り短い時間で完了する必要があります。

リストを使用して、SaveChangesAsyncによって返されるタスクオブジェクトを保持します。

session.Store(loc);

splitter++;
if (splitter % 2048 == 0)
{
    var t = session.SaveChangesAsync();
    tasks.Add(t);

    if (tasks.Count == 2)
    {
        Task.WaitAll(tasks.ToArray());
        tasks.Clear();
    }
}

このコードは、i7(8コア)および12GBRAMを搭載したマシンで実行されています。保持しているタスクオブジェクトの数が2(コードでわかるように)の場合は機能しますが、この数を8(コアの数)に増やすと、System.IndexOutOfRangeException(場合によってはSystem.AggregateException)を受け取ります。 Raven.Abstractions.Exceptions.ConcurrencyException:PUTが、現在以外のetagを使用してドキュメント「X / I」で試行されました」)。

ここでの問題は何ですか?

ありがとう

4

3 に答える 3

5

セッションごとに1つの非同期保留操作のみを持つことができます。

于 2012-06-19T16:53:52.767 に答える
3

このコードには2つの問題があります。

  • セッションに変更を追加しながら、変更を保存しようとしています。
  • 最初のSaveChangesAsyncが終了する前に、別のSaveChangesAsyncをスケジュールしています。これはおそらくConcurrencyExceptionを発生させるものです

少なくとも、各SaveChangesAsync呼び出しが終了するのを待ってから、別の呼び出しをスケジュールする必要があります。

于 2012-06-19T10:28:29.747 に答える
0

BulkInsertを使用することをお勧めします。asyncは役に立たないため、データベースに大量のデータを保存するためのものです。

于 2013-05-06T16:34:21.930 に答える