System.OutOfMemoryException с использованием C # для большого набора данных - PullRequest
1 голос
/ 08 октября 2008

Я использую C # и получаю ошибку System.OutOfMemoryException после того, как прочитал 50 000 записей, что является лучшим методом для обработки таких больших наборов данных? Поможет ли пейджинг?

Ответы [ 5 ]

4 голосов
/ 08 октября 2008

Я мог бы порекомендовать создать файл MDB и использовать DataReader для потоковой передачи записей в MDB, а не пытаться считывать и кэшировать весь набор данных локально. С DataReader этот процесс более ручной, но вы получаете только одну запись за раз, поэтому вы не будете заполнять свою память.

2 голосов
/ 08 октября 2008

Вы все равно не должны читать все сразу. Чтение в чанках, затем запись чанка в файл mdb, затем чтение другого чанка и добавление его в файл Чтение 50 000 записей одновременно просто напрашивается на неприятности.

1 голос
/ 08 октября 2008

Очевидно, что вы не можете прочитать все данные в памяти перед созданием файла MDB, иначе вы не получите исключение из памяти. :-)

У вас есть два варианта: - разбиение - читать данные небольшими порциями, используя фильтрацию - виртуализация - разбить данные на страницы и загрузить только текущую страницу

В любом случае вам необходимо создать файл MDB и передать данные после этого кусками.

0 голосов
/ 12 октября 2008

Я бы предложил использовать генератор :

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

В статье в Википедии также есть хороших примеров

0 голосов
/ 08 октября 2008

Если вы используете xml, просто прочитайте несколько узлов одновременно. Если вы используете какой-то другой формат, просто прочитайте несколько строк (или что-то еще) за раз. Не загружайте все это в память до того, как вы начнете над ним работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...