2009-07-23 3 views
0

У меня есть большой файл размером 2GB с 1,5 миллионами списков для обработки. Я запускаю консольное приложение, которое выполняет некоторые манипуляции с строками, а затем загружает каждый список в базу данных.C# .NET Linq Очистка памяти или утечка?

  1. Я создал объект LINQ и очистить объект, назначив его на новый LinqObject() для каждой записи (петля).

  2. Когда объект будет завершен, я добавлю его в список.

  3. Когда список достигает 100 объектов, я отправляюAll по всему списку, очищаю список, а затем повторяю.

Использование моей памяти продолжает расти по мере запуска программы. Есть ли что-нибудь, что я должен делать, чтобы сохранить использование памяти? Я попробовал GC.collect. Я думаю, что хочу использовать утилиту.

Заранее благодарим за поиск.

+0

Да, мне нужно использовать память, чтобы оставаться на низком уровне. Он вырос до 350 мб после всего 100 тыс. Списков. Я не проверял использование памяти в первый раз, когда я ее запускал, и программа была заблокирована в 1,1 миллиона списков. Использование памяти, вероятно, было значительно выше 1 ГБ – Bryan

+0

Используйте профайлер памяти, чтобы найти проблему; для чего это нужно. –

+0

Можете ли вы опубликовать код, иллюстрирующий, что вы делаете? –

ответ

2

Это нормально для использования памяти в программе, когда она работает. Вы не должны пытаться заставить сборщик мусора уменьшить использование памяти, чтобы попытаться сэкономить ресурсы, это скорее всего приведет к ненужным ресурсам.

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

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

Если вы используете объекты, реализующие интерфейс IDisposable, вы должны вызвать метод Dispose для освобождения неуправляемых ресурсов, но все остальные объекты обрабатываются сборщиком мусора. Обычно управляемые объекты не пропускают память.

0

Полезно Что вы будете делать это? Отсутствие фактической функциональной проблемы, высокий уровень использования памяти сам по себе не является проблемой.

0

Насколько велико использование памяти? Возможно, что .NET просто «оседает» эффективно.

Не совсем ясно, как вы это делаете, но общий принцип звучит хорошо. Я предлагаю вам выполнить работу с базой данных из уравнения - просто закомментируйте, какая строка действительно будет отправлена ​​в базу данных. Посмотрите, сколько памяти используется. Помимо StreamReader (или что-то еще) у вас не должно быть ничего, что нужно утилизировать, если вы не касаетесь базы данных - просто строите партии преобразованных объектов и отбрасываете их.

+0

Да, я использую StreamReader. Но я действительно бросаю объекты? Я использую .clear() в списке после отправки.Я объявляю объект linq один раз, а затем просто перезаписываю его для каждого объекта, объявляя новый SomeLinqObject(); – Bryan

+0

Спасибо за предложение. Распределение памяти увеличивается до 1 ГБ после 500 тыс. Записей без отправки в базу данных. – Bryan

+0

Я бы создал новый список, а не очищал старый, но все должно быть в порядке. Я удивлен распределением памяти, тогда ... Можете ли вы опубликовать некоторый пример кода? –