Быстрый / нехватка памяти для анализа первых двух столбцов в большом CSV-файле с помощью c # - PullRequest
1 голос
/ 08 июня 2011

Я анализирую большие CSV-файлы - около 500 мегабайт (много строк, много столбцов). Мне нужны только первые два столбца (так что до второй запятой в каждой строке). Кроме того, нескольким потокам требуется доступ к этому файлу одновременно, поэтому я не могу получить эксклюзивную блокировку.

Какой самый быстрый / наименее потребляющий память подход к этой проблеме? На какие классы / методы я должен смотреть? Я предполагаю, что я должен оставаться как можно более низкого уровня - читать символ за символом, строка за строкой?

Возможно, это способ одновременного доступа?

using ( var filestream = new FileStream( filePath , FileMode.Open , FileAccess.Read , FileShare.Read ) )
{
     using ( var reader = new StreamReader( filestream ) )
     {
       ...
     }
}

Редактировать
Решили проверить http://www.codeproject.com/KB/database/CsvReader.aspx что, кажется, дает мне возможность прочитать только две колонки, а затем перейти к следующей строке. У них также есть несколько тестов, показывающих высокую производительность и низкий профиль памяти.

Ответы [ 2 ]

4 голосов
/ 08 июня 2011

Если вам нужно мало памяти, вы, вероятно, будете использовать StreamReader и ReadLine построчно.

В аналогичном случае на днях я смог пропустить первые 20 000 000 строк в файле размером 500 МБ ипостроить строку (используя StringBuilder) для следующих 1 000 000 строк примерно за 7 секунд.

3 голосов
/ 08 июня 2011

Предполагая, что файл содержит кодированный в ASCII текст (это будет типично для csv), лучше всего напрямую использовать Stream и метод Stream.Read , который позволяет читать в предварительном формате. выделенный буфер. Это имеет несколько преимуществ:

  1. Вы выделяете буфер только один раз, тогда как ReadLine () создаст новую строку для каждой строки.

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

Дополнительные методы, которые вам, вероятно, понадобятся, включают методы ASCII Encoding , в частности Encoding.ASCII.GetString.

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