Освобождение ресурсов LINQ-to-SQL во избежание исключения OutOfMemoryException - PullRequest
0 голосов
/ 04 января 2011

Фон

Итак, у меня есть простой DataQtext LINQ-to-SQL с одной таблицей, содержащей около 900 МБ PDF-документов в поле VARBINARY, а также некоторые другие идентификаторы. DeferredLoadingEnabled установлено на true. Смысл кода в том, чтобы экспортировать все документы в PDF-файлы на нашем сервере.

Это не первый раз, когда я делаю массовые "скриптовые" вещи вроде linq-to-sql. Это отличный инструмент для простой итерации по многим записям.

Проблема

Моя проблема - после приблизительно 1400 итераций моего foreach (var c in ctx.Documents), который принимает поле Report и использует File.WriteAllBytes(docName, c.Report.ToArray()); для записи его на диск, я получаю OutOfMemoryException.

Поскольку это внутренний фрагмент кода, я просто использовал .Skip(1426) для своего выбора, и он успешно завершился. Излишне говорить, что при наблюдении сбоя моей программы мне действительно не хватало памяти.

Существуют ли хорошие способы избежать этого в будущем или LINQ-to-SQL связано этим ограничением?

Один из возможных ответов Я могу придумать, как установить предел итерации и повторно создавать экземпляр моего DataContext каждые 500 записей или около того. Хотя звучит не очень аккуратно ...

1 Ответ

1 голос
/ 04 января 2011

Вы пробовали с выключенным ObjectChangeTracking (режим только для чтения)?

...