Я вставляю много данных в базу данных RavenDB; около 2 500
000 записей. Это необходимо завершить за меньшее время, насколько это возможно.Использование SaveChangesAsync в RavenDB
Я использую список, чтобы держать объект Task возвращенное 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 основных) и 12 Гб оперативной памяти. Он работает, если количество объектов Task, которые у меня есть, равно 2 (как вы видите в коде), но если я увеличиваю это число до 8 (количество ядер), я получаю System.IndexOutOfRangeException (а иногда и System.AggregateException, в котором говорится: Raven.Abstractions.Exceptions.ConcurrencyException: PUT, выполненный по документу «X/I» с использованием не текущего etag »).
В чем проблема?
Благодаря
Какова цель сбора задач? Вы пытаетесь ограничить количество задач? Это безопасная коллекция типов? –
«tasks» имеет тип List и да, я использовал его для ограничения количества задач. И по другой причине я ВСЕГДА получаю одно из этих исключений, просто повторяя SaveChangesAsync. –
Итак, вы пытаетесь сохранить изменения в сеансе, все еще внося в него изменения? Я сомневаюсь, что это может сработать. Он может работать только в том случае, если SaveChangesAsync сначала сделал копию всех изменений, чтобы вы могли добавлять изменения, сохраняя существующие. Это маловероятно –