Файл читает медленно при первом чтении, но быстро при последовательном чтении - PullRequest
0 голосов
/ 19 ноября 2011

(Это не моя программа, но я постараюсь предоставить всю необходимую информацию, насколько мне известно.)

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

Программа должна прочитать каждый файл несколько раз.Первое чтение файла занимает около 3 секунд, а каждое последующее чтение занимает около 0,1 секунды.Если обработано несколько файлов, возврат к первому файлу все равно приведет к высокой скорости чтения, но через некоторое время повторное чтение файла станет медленным.

Кроме того, если файл копируется в другое место, скоростьпервого чтения нового файла примерно 0,1 секунды.

Если вы выполняете математические вычисления, скорость последовательных чтений примерно равна заявленной скорости чтения жесткого диска.

Все это выглядитнапример, расположение файлов кэшируется операционной системой или жестким диском, поэтому при последовательных чтениях вам не нужно искать расположения файлов.

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

Кроме того, программа работает на Fedora 14 и Scientific Linux, причем обе ОС имеют свои настройки по умолчанию.файловые системы.

Буду признателен за любые идеи.

Ответы [ 4 ]

2 голосов
/ 19 ноября 2011

Linux попытается скопировать файл в оперативную память, чтобы ускорить следующее чтение - я предполагаю, что это именно то, что происходит. Начальное чтение действительно с диска - последующие чтения находятся вне файлового кэша, потому что весь файл был скопирован в RAM

1 голос
/ 19 ноября 2011

ОС (Linux) имеет дисковый кеш. После того, как вы прочитали файл один раз, он находится в кеше.

0 голосов
/ 20 ноября 2011

Да, данные кэшируются . Вы можете форсировать это кэширование с помощью системного вызова readahead (или просто прочитав его другим процессом). Если вы используете mmap , вы также можете использовать madvise

0 голосов
/ 19 ноября 2011

Я думаю, что, может быть, в первый раз, когда он читает файл, требуется больше времени, потому что он загружает некоторую информацию в кеш?

После первого раза он просто использует часть информации в кеше.

...