Как управлять системой исключения из памяти? - PullRequest
0 голосов
/ 29 апреля 2019

Я имею дело примерно с 3 ГБ данных. Он хранится в базе данных Oracle. Моя задача - перечислить эти данные в datagridview. Вот почему я создал класс для хранения этих данных, а затем использую этот genericList для передачи источника данных datagridview. Тем не менее после того, как приблизительно 1300 строк данных были обработаны в оперативной памяти, код возвращает исключение «stackoutofmemory». И программа перестает работать.

Я попытался очистить данные genericList после загрузки 1300 МБ данных и использовал сборку мусора для очистки данных в оперативной памяти. Но это не сработало. vshost32.exe все еще был увеличен.

var dataList = cmd=........... // get dataList from DB
list<class> dataList2 = new list<class>();

foreach(var data in dataList) {
     dataList2.add(new class{
    ...........//fill the DataList2
});

datagridview.datasource = datalist2;

Я ожидал, что мой genericlist будет работать правильно после заполнения genericList. Но vshost32.exe был сгенерирован системным исключением из памяти.

1 Ответ

1 голос
/ 29 апреля 2019

Есть несколько проблем, с которыми вы имеете дело, давайте обсудим их одну за другой:

Я имею дело примерно с 3 ГБ данных.Он хранится в базе данных Oracle.Моя задача состоит в том, чтобы перечислить эти данные в datagridview

Во-первых, никто не может просматривать данные объемом 3 ГБ за один раз, поэтому они всегда видны по частям, поэтому данные разбиваются на страницы для предоставления ограниченного просмотра страниц

Вот почему я создал класс для хранения этих данных, а затем использую этот genericList для передачи источника данных datagridview

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

Я пытался очистить данные genericList после загрузки 1300 МБ данных и использовал мусорсбор для очистки данных в оперативной памяти.Но это не сработало.vshost32.exe все еще был увеличен.

Здесь есть пара моментов, не уверен, как вы очистили данные при 1300 МБ, но вы наверняка используете 32-битный процесс, который имеет пользовательский лимит2 ГБ и, следовательно, OOM при пересечении этого лимита.Оставшиеся 2 ГБ предназначены для процесса ядра, который вы можете настроить до 3 ГБ для пользовательского процесса, но обычно вы имеете дело с внутренним пределом структуры данных или вы просто предполагаете, что очищаете любую память, поскольку GC особенно недетерминирован,он довольно быстро пересекает границу

Какое решение?

  1. Использование 64-битного процесса в 64-битной системе, что обеспечит выход изисключение памяти исчезает, так как ограничение памяти теперь составляет 2 ^ 64 байта = 16 ExaBytes.Вы можете убедиться, что процесс / двоичный файл совместим с 64-битной системой
  2. Сохраняйте данные в кеше памяти и привязывайте только одну или две страницы к источнику сетки данных. Кэш лучше подходит для данных такого типа, его быстрая работадоступ, особенно если у вас нет нехватки ОЗУ

В основном в 64-битном процессе никогда не бывает нехватки памяти, так как ни в одной системе обычно объем оперативной памяти не превышает 16 ExaBytes, даже если пользователю назначена только половинапроцесс

...