2014-01-18 3 views
8

В C++, как дорого использовать istream :: seekg?Использует istream :: seekg слишком дорого?

EDIT: Сколько я могу избежать поиска файла и чтения байтов? Что относительно частоты и величины смещения?

У меня есть большой файл (4 ГБ), который я анализирую, и я хочу знать, нужно ли пытаться консолидировать некоторые из моих запросов. Я бы предположил, что величина различий в местоположении файлов играет роль - например, если вы ищете больше, чем страницу в памяти, это будет влиять на производительность, но небольшие поиски не имеют никакого значения. Это верно?

+2

Позиция - это просто указатель, изменение его на самом деле не будет читать содержимое файла. – WiSaGaN

+0

Ах дерьмо. Хорошо, позвольте мне сделать мой вопрос более разумным ... – Brian

+0

wait ... no У меня была веская причина для этого. – Brian

ответ

6

Этот вопрос сильно зависит от вашей операционной системы и дисковой подсистемы.

Очевидно, что сам поиск будет иметь практически нулевое время, так как он просто обновляет смещение. Фактически чтение вытащит некоторые данные с диска ...

... но сколько данных зависит от многих факторов. На вашем диске есть кеш, который может иметь свой собственный размер блока и может делать что-то вроде чтения. Ваш RAID-контроллер (если есть) будет иметь свой собственный кеш, возможно, с его собственным размером блока и чтением вперед.

В вашем ядре есть кеш-страница - вся свободная оперативная память, по существу, - и она также, вероятно, будет делать что-то вроде чтения вперед. В Linux это настраивается, и ядро ​​будет адаптировать его, основываясь на том, как выглядят последовательные ваши шаблоны доступа: вы вызывали posix_fadvise и т. Д.

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

Если у вас есть возможность кодирования, чтобы вы последовательно получали доступ к файлу, это, безусловно, будет быстрее, чем случайные чтения, особенно небольшие случайные чтения. Поиск на одном механическом диске занимает примерно 10 мс, поэтому вы можете сделать математику здесь. (Хотя поиск на твердотельном диске примерно в 100 раз быстрее.)

Большие чтения, как правило, лучше, чем небольшие чтения ... Хотя данные обработки несколько килобайт за раз могут быть быстрее, чем большие блоки, если это позволяет обрабатывать оставаться в кеше.

Короче говоря, вам нужно будет предоставить более подробную информацию о вашей системе и вашем приложении, чтобы получить правильный ответ, и даже тогда наиболее вероятный ответ «сравнивает его».

+0

Хорошо, я сравню его. Спасибо за советы – Brian

Смежные вопросы