Связь между ReadLine и доступом к диску

В настоящее время я использую такую ​​конструкцию кода:

 string line;
 using (System.IO.StreamReader file = new System.IO.StreamReader("somelargefile.txt"))
 {
     while ((line = file.ReadLine()) != null)
     // do something
 }

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

Тогда нет никакой связи между ReadLine и доступом к физическому диску?


person Bart Gijssens    schedule 08.06.2011    source источник


Ответы (2)


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

В MSDN есть подробное объяснение принципов.

person jonsca    schedule 08.06.2011

Требуемая информация считывается построчно вашим процессом, но операционная система будет обращаться к файлу, отображая файл в памяти. Поэтому, когда вы читаете строку на той же странице памяти, доступ происходит довольно быстро. Доступ к диску будет осуществляться, когда страница недоступна в памяти и имеется ошибка страницы. В этот раз операционная система извлечет какую-то ненужную страницу и загрузит нужную страницу в память. Чтение подкачки и доступа к памяти в операционных системах.

person ferosekhanj    schedule 08.06.2011
comment
Это определенно относится к файлам с отображением памяти, но действительно ли .NET использует их за кулисами для обычных потоков? Я ожидаю, что любая буферизация будет выполняться на уровне пользователя. - person SoftMemes; 08.06.2011
comment
.Net специально этого не делает. Как сказал @jonsca, в .Net выполняется некоторая буферизация. Но отображение памяти выполняется ОС в фоновом режиме. Прочтите этот вопрос stackoverflow.com / questions / 641614 /. То же самое относится и к .Net. - person ferosekhanj; 08.06.2011