2016-08-29 8 views
0

У меня есть большая коллекция из 12000 записей данных, например, и вы хотите вставить их через EF6 в базу данных sqlite. Самое время потребляет инстанцирование моделей данных:Ускорение создания экземпляра модели для EF6/sqlite db

в момент I цикла 'нового myItem() 12000 раз

downloaded12000Items.foreach(result =>{ 
    var myItem= new myItem 
    { 
     Id = result.Id, 
     Description = result.Description, 
     Property1 = result.Property1 
    } 
    resultList.add(myItem); 
}); 

unitOfWork.ItemRepository.InsertRange(resultList); 

Как я могу ускорить создание экземпляра модели или есть возможно, еще один способ быстрее вставить данные в базу данных sqlite?

EDIT: Я должен объяснить свою проблему лучше. Узким местом является NOT insert() в базе данных. Чтобы использовать EF6 .insert (someModel), вам нужно создать экземпляр класса модели вашего объекта. Я должен сделать это 12000 раз, создание всех классов класса 12000 занимает слишком много времени.

Вопрос был в том, есть ли возможность закрепить процесс становления классов моделей, возможно, путем клонирования или чего-то еще?

Возможно, есть возможность вставить данные в базу данных sqlite без использования .insert (someModel), может быть, используя прямую команду sql или что-то еще? Очевидно, что было бы полезно ускользнуть от экземпляра модели ...

+0

РЕДАКТИРОВАТЬ: это не вставка, которая идет медленно. это простая петлевая установка объектов модели. Сама вставка довольно быстро. – tronc

+0

Ваш последний комментарий противоречит вашему последнему заявлению в вашем вопросе – MickyD

+0

Я думаю, что это узкое место: 'unitOfWork.ItemRepository.Insert (myItem);' - поскольку контекст должен отслеживать все эти 12k элементов. Сначала это не занимает много времени, но после 100 или 1000 записей. – Maarten

ответ

1

Узкое место, вероятно, является добавлением сущностей в контекст.

unitOfWork.ItemRepository.Insert(myItem); 

Поначалу это занимает не много времени, но после 100 или 1000 записей.

См. Также this answer для других оптимизаций, которые вы могли бы добавить (прочитайте комментарии связанного ответа!).

0

Как ускорить создание экземпляров моделей или может быть другой способ вставить данные быстрее в базу данных sqlite?

Используйте эквивалент await Context.SaveChangesAsync() в вашем репо после того, как вы закончили цикл и вставив «12000 записей данных». Tell me more

Примечания это больше не нужно выполнить следующие действия для того, чтобы улучшить производительность:

context.Configuration.AutoDetectChangesEnabled = false; // out of date 
context.Configuration.ValidateOnSaveEnabled = false; // out of date 

... такой код имеет свои недостатки, но что более важно, она основана на устарелых философиях и не использует await в EF.

Вот фрагмент производственного кода, который я использую, чтобы сохранить матрицу реализации требования:

// create your objects 
var matrix = // in my prod code I create in excess of 32,600+ matrix cells 
foreach (var cell in cellsToAdd) 
{ 
    matrix.Cells.Add(cell); 
} 

using (var context = new MyDbContext()) 
{ 
    context.Matrices.Add (newMatrix); 

    await context.SaveChangesAsync(); 
} 

Я считаю, это работает отлично, когда я вставляю 32,646 ячеек матрицы в моей производственной среде. Просто используя await и SaveChangesAsync() улучшенная производительность 12 раз. Другие стратегии, такие как , пакетные были не такими эффективными и отключенными опциями, как AutoDetectChangesEnabled, хотя несколько полезными, возможно победить цель использования ORM.

+0

Зачем было бы быстрее вставлять данные в базу данных sqlite? – Maarten

+0

Как он сообщит один сингл "sql". В противном случае будет сделано 11000 отдельных запросов. – AntonR

+0

@Maarten http://stackoverflow.com/a/30043327/585968. По моему опыту он делал это в 12 раз быстрее – MickyD