Есть несколько проблем, с которыми вы имеете дело, давайте обсудим их одну за другой:
Я имею дело примерно с 3 ГБ данных.Он хранится в базе данных Oracle.Моя задача состоит в том, чтобы перечислить эти данные в datagridview
Во-первых, никто не может просматривать данные объемом 3 ГБ за один раз, поэтому они всегда видны по частям, поэтому данные разбиваются на страницы для предоставления ограниченного просмотра страниц
Вот почему я создал класс для хранения этих данных, а затем использую этот genericList для передачи источника данных datagridview
Большинство структур данных, таких как источник данных datagridview, имеют внутренний пределони не предназначены для хранения этих огромных данных, они либо нарушат структуру данных, либо приведут к снижению производительности
Я пытался очистить данные genericList после загрузки 1300 МБ данных и использовал мусорсбор для очистки данных в оперативной памяти.Но это не сработало.vshost32.exe все еще был увеличен.
Здесь есть пара моментов, не уверен, как вы очистили данные при 1300 МБ, но вы наверняка используете 32-битный процесс, который имеет пользовательский лимит2 ГБ и, следовательно, OOM при пересечении этого лимита.Оставшиеся 2 ГБ предназначены для процесса ядра, который вы можете настроить до 3 ГБ для пользовательского процесса, но обычно вы имеете дело с внутренним пределом структуры данных или вы просто предполагаете, что очищаете любую память, поскольку GC особенно недетерминирован,он довольно быстро пересекает границу
Какое решение?
- Использование 64-битного процесса в 64-битной системе, что обеспечит выход изисключение памяти исчезает, так как ограничение памяти теперь составляет 2 ^ 64 байта = 16 ExaBytes.Вы можете убедиться, что процесс / двоичный файл совместим с 64-битной системой
- Сохраняйте данные в кеше памяти и привязывайте только одну или две страницы к источнику сетки данных. Кэш лучше подходит для данных такого типа, его быстрая работадоступ, особенно если у вас нет нехватки ОЗУ
В основном в 64-битном процессе никогда не бывает нехватки памяти, так как ни в одной системе обычно объем оперативной памяти не превышает 16 ExaBytes, даже если пользователю назначена только половинапроцесс