2012-06-19 3 views
2

Я вставляю много данных в базу данных 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 »).

В чем проблема?

Благодаря

+0

Какова цель сбора задач? Вы пытаетесь ограничить количество задач? Это безопасная коллекция типов? –

+0

«tasks» имеет тип List и да, я использовал его для ограничения количества задач. И по другой причине я ВСЕГДА получаю одно из этих исключений, просто повторяя SaveChangesAsync. –

+0

Итак, вы пытаетесь сохранить изменения в сеансе, все еще внося в него изменения? Я сомневаюсь, что это может сработать. Он может работать только в том случае, если SaveChangesAsync сначала сделал копию всех изменений, чтобы вы могли добавлять изменения, сохраняя существующие. Это маловероятно –

ответ

5

Вы можете иметь только одну операцию ожидания асинхронного режима в сеансах.

3

Есть две проблемы с этим кодом:

  • Вы пытаетесь сохранить изменения в то же время добавив изменения в сессии.
  • Вы планируете еще один SaveChangesAsync до завершения первого. Это то, что, вероятно, повышает ConcurrencyException

По крайней мере, вы должны дождаться завершения каждого вызова SaveChangesAsync перед планированием другого.

+0

Не может ли это сделать всю асинхронную вещь? –

0

Вы хотите использовать BulkInsert. Он предназначен для сохранения большого количества данных в базе данных, потому что асинхронный вызов вам не поможет.

Смежные вопросы