Исключение типа 'Система. OutOfMemoryException' был брошен. Почему?

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

. Факты
div.pvw-title { /* no :after or :before required*/
content: url("your url here");
}
17
задан ninesided 18 December 2008 в 07:05
поделиться

4 ответа

Это работает успешно в первый раз, но если я выполняю его снова, я продолжаю получать Систему. OutOfMemoryException. Каковы некоторые причины, это могло происходить?

Независимо от того, что другие сказали, ошибка не имеет никакого отношения к упущению расположить Ваш DBCommand или DBConnection, и Вы не зафиксируете свою ошибку путем избавления от любого из них.

ошибка имеет все, чтобы сделать с Вашим набором данных, который содержит почти 600 000 строк данных. По-видимому, Ваш набор данных использует больше чем 50% доступной памяти на Вашей машине. Очевидно, у Вас закончится память при возврате другого набора данных того же размера, прежде чем первый был собран "мусор". Простой как это.

можно исправить эту проблему несколькими способами:

  • Рассматривают возврат меньшего количества записей. Я лично не могу вообразить время, когда возврат 600K записи когда-либо был полезен для пользователя. Для уменьшения возвращенных записей попробуйте:

    • Ограничение Вашего запроса к первым 1 000 записей. Если существует больше чем 1 000 результатов, возвращенных из запроса, сообщите пользователю для сужения их результатов поиска.

    • , Если Ваши пользователи действительно настаивают на том, чтобы видеть так много данных сразу, попробуйте подкачку страниц данные.Помните: Google никогда не показывает Вам все 22 огромного количества результатов поиска сразу, он показывает Вам приблизительно 20 записей за один раз. Google, вероятно, не содержит все 22 огромного количества результатов в памяти сразу, это, вероятно, находит свое больше памяти эффективным для перезапросов ее базы данных для генерации новой страницы.

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

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

  • Удаляют все ссылки на Ваш старый набор данных. Что-либо держащееся за refenence Вашего набора данных будет препятствовать тому, чтобы он был исправлен памятью.

  • , Если Вы не можете аннулировать все ссылки на свой набор данных, очистите все строки от набора данных и любых объектов, связанных с теми строками вместо этого. Это удаляет ссылки на datarows и позволяет им быть съеденными сборщиком "мусора".

я не полагаю, что необходимо будет звонить GC.Collect() для принуждения цикла генерала. Мало того, что это обычно - плохая идея звонить GC.Collect(), потому что давление достаточной памяти вызовет.NET, вызывают сборщик "мусора" самостоятельно.

Примечание: вызов Располагает на Вашем наборе данных, не освобождает памяти, и при этом это не вызывает сборщик "мусора", и при этом это не удаляет ссылку на Ваш набор данных. Расположите используется для чистки неуправляемых ресурсов, но DataSet не имеет никаких неуправляемых ресурсов. Это только реализует IDispoable, потому что это inherents от MarshalByValueComponent, таким образом, Расположить метод на наборе данных в значительной степени бесполезен.

43
ответ дан 30 November 2019 в 10:29
поделиться

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

7
ответ дан 30 November 2019 в 10:29
поделиться

Вы, очевидно, не избавляетесь от вещей.

Рассматривают команду "использования" при временном использовании объектов та реализация IDisposable.

3
ответ дан 30 November 2019 в 10:29
поделиться

Где это перестало работать?

я соглашаюсь, что Ваша проблема, вероятно, что Ваш набор данных 600 000 строк является, вероятно, просто слишком большим. Я вижу, что Вы затем добавляете его к Сессии. При использовании состояния сеанса Sql оно должно будет сериализировать те данные также.

Даже при избавлении от объектов правильно у Вас всегда будет по крайней мере 2 копии этого набора данных в памяти при выполнении его дважды, однажды на сессии, однажды в процессуальном кодексе. Это никогда не будет масштабироваться в веб-приложении.

Делают математику, 600 000 строк, даже в гуиде на 1-128 битов на строку привели бы к 9,6 мегабайтам (600k * 128 / 8) просто данных, не говоря уже о наборе данных наверху.

Trim вниз Ваши результаты.

0
ответ дан 30 November 2019 в 10:29
поделиться