2

我正在将大量数据插入 RavenDB 数据库;约 2 500000 条记录。这需要在尽可能短的时间内完成。

我使用一个列表来保存 SaveChangesAsync 返回的 Task 对象:

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 核)和 12 GB 内存的机器上运行。如果我持有的 Task 对象的数量为 2(如您在代码中看到的那样),它会起作用,但如果我将此数字增加到 8(核心数),我会收到 System.IndexOutOfRangeException (有时还会收到 System.AggregateException ,上面写着:“ Raven.Abstractions.Exceptions.ConcurrencyException:尝试使用非当前 etag 对文档“X/I”进行 PUT”)。

这里有什么问题?

谢谢

4

3 回答 3

5

每个会话只能有一个异步挂起操作。

于 2012-06-19T16:53:52.767 回答
3

这段代码有两个问题:

  • 您正在尝试保存更改,同时仍向会话添加更改。
  • 您正在安排另一个 SaveChangesAsync 在第一个完成之前。这可能会引发 ConcurrencyException

至少您应该等待每个 SaveChangesAsync 调用完成,然后再安排另一个。

于 2012-06-19T10:28:29.747 回答
0

你会想要使用BulkInsert。它用于将大量数据保存到数据库中,因为异步对您没有帮助。

于 2013-05-06T16:34:21.930 回答