我将大量数据插入RavenDB数据库;大约2 500
000条记录。这需要在尽可能短的时间内完成。
我使用一个列表来保存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 RAM的机器上运行。如果我持有的Task对象的数量是2(如您在代码中看到的那样),但是如果我将此数字增加到8(核心数),则会收到System.IndexOutOfRangeException(有时会出现System.AggregateException: Raven.Abstractions.Exceptions.ConcurrencyException:PUT尝试在文档'X / I'上使用非当前的etag“)。
这里有什么问题?
由于
答案 0 :(得分:5)
每个会话只能有一个异步挂起操作。
答案 1 :(得分:3)
此代码存在两个问题:
至少应该等待每个SaveChangesAsync调用完成,然后再安排另一个。
答案 2 :(得分:0)
您需要使用BulkInsert。它用于将大量数据保存到数据库中,因为异步对您没有帮助。