Кеширование в mmap - PullRequest
       11

Кеширование в mmap

2 голосов
/ 23 апреля 2010

Я использую вызов mmap для чтения из очень большого файла, используя простую арифметику указателей в C ++. Проблема в том, что когда я читаю небольшие порции данных (порядка килобайт) несколько раз, каждое чтение занимает столько же времени, сколько и предыдущее. Как узнать, осуществляется ли доступ к диску для выполнения моего запроса или выполняется ли запрос из основной памяти (кеша страниц) в вызовах после первого.

Ответы [ 2 ]

3 голосов
/ 23 апреля 2010

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

echo 3 > /proc/sys/vm/drop_caches

, который очищает кэш, затем, если я запускаю две итерации для получения одних и тех же данных, первый запуск (в моем случае) в 10 раз медленнее второго.

0 голосов
/ 23 апреля 2010

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

...