Вопрос относительно оптимизации чтения и записи в файл через mmap (2)? - PullRequest
0 голосов
/ 25 июня 2019

У меня проблемы с оптимизацией в моем коде.Я постараюсь объяснить сценарий, в котором я нахожусь. Если не ясно, пожалуйста, спросите.

Проблема прямая.Ранее у меня было 2 отдельных файла, которые я открывал в одном и том же процессе и вызывал mmap(2) для обоих по отдельности.К первому сопоставлению чаще обращаются, чем ко второму. (Как для чтения, так и для записи). Я подумал, что нужно оптимизировать код больше, вместо того, чтобы использовать 2 отдельных файла, я мог бы просто поместить содержимое первого файла (размер которого действительно мал по сравнению со вторымfile) в начале второго файла и сдвиньте корень второго файла вперед на требуемое смещение.Это позволит избежать использования 2 файлов и, следовательно, избежать вызовов на open(2) и mmap(2).Поскольку этот код настройки (который вызывает open(2) и mmap(2)) будет вызываться как минимум 100 000+ раз, удаление этих двух вызовов должно было иметь значение.Но я не знаю, почему доступ к части, которую я переместил в начало 2-го файла, стал намного медленнее.В Google я где-то читал, что это может быть случай некоторого кэширования страницы, но я не уверен, что это так, потому что операция записи стала почти в 10-20 раз медленнее.Пожалуйста, предложите мне, как я могу улучшить это?

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Вы можете использовать два указателя из одного и того же отображения:

int len = 1300,
    off = 600,
    prot = PROT_READ | PROT_WRITE,
    flags = MAP_SHARED,
    fd = open("file", O_RDWR);
char *map = mmap(NULL, len, prot, flags, fd, 0),
     *map2 = map + off;

*map = 'a';
*map2 = 'b';

Не используйте аргумент offset, если он не кратен размеру страницы (обычно 4096).

0 голосов
/ 25 июня 2019

Чтобы получить одинаковые шаблоны ввода-вывода с одним файлом, как вы получили с двумя файлами, убедитесь, что вторая часть файла начинается с границы страницы (4 КБ). Возможно, вам придется дополнить первую часть, чтобы это произошло.

...