2017-01-26 3 views
0

У меня есть следующий сценарий: я создаю фиктивное веб-приложение, которое каждую минуту переносит ставки, сохраняет все события, совпадения, коэффициенты и т. Д. В базе данных, а затем обновляет пользовательский интерфейс ,Хранение огромного количества сущностей в базе данных SQL Server

У меня есть эта структура: Спорт>События>Матчей>Ставок>Odds и я использую код первого подхода и для всех БД, связанных с операциями, которые я использую EF.

Когда я бегу мое приложение в первый раз, и моя база данных пуста Я получаю XML с коэффициентом, который содержит: ~ 16 спортивных, ~ 145 событий, ~ 675 матчей, ~ 17100 ставки & ~ 72824 шансов.

Здесь возникает проблема: как сохранить все эти объекты своевременно? Анализ не занимает много времени - 0,2 секунды, но когда я пытаюсь навалом хранить все эти объекты, я сталкиваюсь с проблемами памяти, и сохранение занимает более 1 минуты, поэтому запускается следующее нечетное нажатие, и это кошмар.

Я видел где-то, чтобы отключить Configuration.AutoDetectChangesEnabled и воссоздать мой контекст на каждые 100/1000 записей, которые я вставляю, но я почти не там. Каждое предложение будет оценено по достоинству. Заранее спасибо

+0

«но я не почти там», значит, вы пробовали его и видели, что он не много сделал? Я лично сталкивался с подобными проблемами с массовыми операциями, в то время как «Configuration.AutoDetectChangesEnable» и контекст воссоздания помогли немного, я нашел совсем другой способ. –

ответ

0

Я понимаю вашу ситуацию, но:

Все действия, которые вы делали все это зависит от вашей машины спецификации и само программное обеспечение.

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

1

Когда вы вставляете огромные (хотя и не такие огромные) данные, как это, попробуйте использовать SqlBulkCopy. Вы также можете попробовать использовать Table Value Parameter и передать его в хранимую процедуру, но я не предлагаю его для этого случая, так как TVPs хорошо работают для записей под 1000. SqlBulkCopy очень прост в использовании, что является большим плюсом.

Если вам нужно сделать обновление для многих записей, вы можете использовать SqlBulkCopy для этого, но с небольшим трюком. Создайте промежуточную таблицу и вставьте данные с помощью SqlBulkCopy в промежуточную таблицу, затем вызовите хранимую процедуру, которая будет получать записи из промежуточной таблицы и обновлять целевую таблицу. Я использовал SqlBulkCopy для обоих случаев много раз, и он работает очень хорошо.

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

Могу ли я это сделать, используя только EF?

Я не пробовал, но есть this библиотека, которую вы можете попробовать.

+0

Использование SqlBulkCopy Я смог сохранить 80 тыс. Сущностей объектов на 1,8 секунды, но поскольку это не часть EF, я могу сделать это, используя только EF? –

+0

EF не имеет прямой поддержки для массовых операций, но вы можете приобрести библиотеку, которая добавляет такие возможности. Он называется «Расширения платформы Entity». Или вы можете написать свой собственный, как я. – Amy

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