Я работаю над пакетным процессом, который выгружает ~800 000 записей из медленной устаревшей базы данных (1,4-2 мс на время выборки записи... это суммируется) в MySQL, который может немного Быстрее. Чтобы оптимизировать это, я загружал все записи MySQL в память, что увеличивает использование примерно до 200 МБ. Затем я начинаю делать дамп из устаревшей базы данных и обновлять записи.
Первоначально, когда это завершало обновление записей, я вызывал SaveContext, что затем увеличивало объем моей памяти с ~500–800 МБ до 1,5 ГБ.Очень скоро я бы избавился от исключений памяти (виртуальная машина, на которой это работает, имеет 2 ГБ ОЗУ), и даже если бы я дал ей больше ОЗУ, 1,5-2 ГБ все еще немного избыточно, и это было бы просто добавлением полосы -помощь в проблеме. Чтобы исправить это, я начал вызывать SaveContext каждые 10 000 записей, что немного помогло, и, поскольку я использовал делегатов для извлечения данных из устаревшей базы данных и обновления их в MySQL, я не получил слишком ужасного удара по производительности, так как после Подождите 5 секунд или около того, пока он будет сохраняться, затем он запустит обновление в памяти для 3000 или около того записей, для которых было выполнено резервное копирование. Тем не менее, использование памяти продолжает расти.
Вот мои потенциальные проблемы:
Одно из возможных решений, о котором я подумал, — это каким-то образом освободить память, используемую сущностями, к которым, как я знаю, я больше никогда не прикоснусь, поскольку они уже были обновлены (например, очистка кеша, но только для определенного элемента), но я не не знаю, возможно ли это вообще с Entity Framework.
Есть у кого мысли?