Связь между ReadLine и доступом к диску - PullRequest
2 голосов
/ 08 июня 2011

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

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

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

Нет ли связи между ReadLine и доступом к физическому диску?

Ответы [ 2 ]

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

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

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

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

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

...