#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, что, теоретически, должно сильно повысить производительность. Ещё желательно правильно выставить набор флагов для открытия файла.
Комментариев нет:
Отправить комментарий