Обработка больших текстовых файлов в .NET 3.5 c # - PullRequest
2 голосов
/ 25 августа 2010

Мне поручено прочитать большой текстовый файл (около 150 МБ), проанализировать его и отобразить записи в сетке данных. Файл ограничен круглыми скобками.

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

У меня есть два вопроса / проблемы:

  1. Это лучший способ сделать это? Чтение файла 150 МБ в память для большого размера? Какова наилучшая практика при выполнении этого вида работы?

  2. Объем памяти, выделяемый для процесса, ОГРОМНЫЙ ... что понятно, потому что я читаю такой большой файл. Но проблема в том, что он не освобождается. Поэтому, если я захочу обработать два файла, все больше и больше памяти будет выделено. Пока в какой-то момент программа просто вылетит. Я предполагаю, что на объект набора данных ссылается что-то, что препятствует выделению памяти ... Есть ли способ определить, что это за объект? Есть ли инструмент или метод, который я могу использовать для этой цели?

Любая помощь по этому вопросу будет принята с благодарностью. Мне никогда не приходилось беспокоиться об управлении памятью. Благодарю.

Ответы [ 5 ]

1 голос
/ 25 августа 2010

Во-первых, проблема с памятью - найти профилировщик (я использовал тот, что использовался в JetBrains, но почти любой подойдет). Это, по крайней мере, скажет вам, что именно потребляет память

это может не решить вашу конкретную проблему Я не использовал подход для 150 МБ данных но мой собственный первый подход, как правило, заключается в том, чтобы обернуть файл в IEnumerable, читая по одной записи за раз и делая это лениво.

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

1 голос
/ 25 августа 2010

Поскольку память не освобождается: если вы используете что-то наподобие StreamReader для чтения в тексте, вам нужно вызвать .Dispose (), когда вы закончите (или поместить в использование () {} блок).Это может как-то повлиять на то, почему сборщик мусора не собирает.

Однако, для вашего первого вопроса 150мг на самом деле не так уж и много, если предположить, что вы делаете только один текстовый файл за раз.Я не буду беспокоиться об этом, пока вам не понадобятся множественные / параллельные процессы.

1 голос
/ 25 августа 2010
  1. Это приемлемо, если вы когда-либо читаете только один файл, и вы не ожидаете, что он вырастет намного выше 150 МБ. Важным фактором здесь является то, что у пользователей вашего приложения достаточно памяти для открытия файла. 150 МБ это немного, если вы получите 150 ГБ, у вас будут проблемы.
  2. Это потому, что у вас, скорее всего, где-то есть ссылка на ваш файл в памяти. Вероятно, из-за того, что вы отображаете его на экране.

Если вам нужно загрузить все это в память, чтобы пользователи вашего приложения могли минимизировать файл, ваши руки связаны. Вы можете попробовать потоковую передачу записей по мере необходимости. Классы TextReader и / или StreamReader, вероятно, являются хорошей отправной точкой, если вы хотите пойти по этому пути.

0 голосов
/ 25 августа 2010

Лично я бы подумал о разбиении на страницы и загружал, скажем, 100 записей за раз.Затем очистите память и загрузите следующие 100, когда они нажмут кнопку «Далее».Подобно тому, как результаты в поисковой системе будут справляться с этим, они могут «показывать ВСЕ результаты на одной странице, так как загрузка будет длиться вечно, поэтому они разбивают его на более мелкие куски.Есть ли причина, по которой вам нужны все загруженные данные?

0 голосов
/ 25 августа 2010

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

Альтернативно используйте ключевое слово "using"

using (File newFile = input.read()) {
    // Do stuff


}

Нет комментариев к набору данных

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