Страницы

Поиск по вопросам

суббота, 8 февраля 2020 г.

Улучшить быстродействие StreamReader.ReadLine()

#c_sharp #net #потоки_данных


Собственно есть много(~2GB) больших(~10MB) текстовых файлов. Каждая строка в файле
это запись лога. Нужно пройти по всем файлам и по всем строками и применить Regex(...).

И как и ожидалось Regex.IsMatch() прилично замедляет выполнение.
Но, по мимо этого профайлер показал что 44% времени тратится на sr.ReadLine()

вот стандартная часть кода:

using (StreamReader sr = File.OpenText(file))
{
    while ((line = sr.ReadLine()) != null) // <-- 44% Time
    {
        //... 
    }
}


Вопрос: есть способ как то быстрее читать файл построчно?
    


Ответы

Ответ 1



Насколько я смог понять отсюда и отсюда, File.OpenText создаёт StreamReader с довольно небольшим буфером для чтения. Метод ReadLine, в свою очередь, использует буфер именно этого размера. Поэтому первым делом я бы попробовал создать FileStream и StreamReader поверх него, задав размер буфера побольше: const int bufferSize = 16 * 1024 * 1024; // 16Mb FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, bufferSize, FileOptions.SequentialScan); using (StreamReader sr = new StreamReader(fs, Encoding.UTF8, true, bufferSize)) { ... }

Ответ 2



Обращение к файловой системе — это традиционное узкое место многих приложений. В отличие от C++, где есть нюансы, в C# метод ReadLine заметно не оптимизируется. Можете попробовать FileOptions.SequentialScan, но на многое не рассчитывайте. Вам поможет только SSD.

Ответ 3



Если воспользоваться winapi, то можно присобачить чтение через memory mapped file, что, теоретически, должно сильно повысить производительность. Ещё желательно правильно выставить набор флагов для открытия файла.

Комментариев нет:

Отправить комментарий