2013-06-27 6 views
5

Я знаю, что не рекомендуется использовать Entity Framework для массового вставки, поскольку он добавляет их по одному. (Example 1, example 2.)Сохранение большого графа с Entity Framework 5

Как насчет прикрепления одного объекта, который имеет большой граф под ним, например. 100Ks объектов? - В частности:

  • Каковы соображения производительности (времени/памяти) для использования EF5 для этого?
  • Есть ли какие-либо рекомендации по хранению больших графиков?
  • Являются ли реляционные базы данных хорошей идеей для хранения больших графиков?

Немного фона:

  • График создается с помощью EF5 Pocos, затем прикрепляется в корне и сохранены. График всегда является новым, никогда не обновляется. БД, который мы используем, - это SQL Server 2012.

  • Фактический процесс создания может потребовать десятки секунд для больших случаев (100 КБ объектов), поэтому, если процесс attach/save занимает 10% от этого времени, он не будет оказывают значительное влияние на общую производительность по времени.

+0

Не обязательно добавлять объекты по одному. В моей практике я разделил свой объектный граф на независимые (почти) части и загружал его поэтапно, чтобы сохранить целостность, а не получать «OutOfMemoryException» или просто часы безнадежного ожидания. – Fedor

+0

@Fyodor У меня не получилось исключение из памяти, и это не занимало несколько часов. –

+0

Тогда вам повезло, и ваш график более удобен, чем мой. – Fedor

ответ

4

Поскольку никто не ответил по какой-либо причине, даже широко известный здесь эксперт EF, я попробую спросить.

В последнее время я занимаюсь сложной моделью с большим количеством ссылок цикла и количеством отношений между сущностями. И большой объем данных, да, так же, как ваш или больше. Я пробовал много вещей, и никто не был удобен для меня, поэтому я закончил с использованием Fastest Way of Inserting in Entity Framework. Это очень помогло мне год назад, и вы никоим образом не упоминаете об этом в своем вопросе.


Но если у вас нет много сложных отношений между субъектами и имеют большое количество совершенно новых данных, чтобы вставить только один раз, то самый быстрый способ, как вы уже mentioned является SqlBulkCopy, потому что это очень быстро и просто в этом случае.
Используя подход CodeFirst, вы, например, можете сначала создать структуру базы данных, а затем просто вставить свои данные.

Надеюсь, это поможет! Не думаю, что если использование NoSQL-хранилища будет быстрым или удобным в вашем случае, поскольку я никогда не использовал эти решения. Может быть, опытные коллеги расскажут об этом.

+0

Таким образом, чем больше объектов добавляется за одну операцию, тем быстрее, если операция не занимает слишком много памяти. Разделить по типу объекта и вставить весь объект этого типа, используя SqlBulkCopy, является самым быстрым? –

+0

Да, это самый быстрый способ сделать это. Для ввода всех этих записей потребуется всего несколько секунд. – Fedor