Когда использовать mmap () или read () для файла, есть ли эмпирическое правило? - PullRequest
0 голосов
/ 13 декабря 2018

Я работаю с утилитой Mac, которая выполняет сжатие HFS.Первоначально он считывал весь файл в память, используя read(2), а затем создавал сжатое представление, которое затем сохранялось бы в расширенных атрибутах файла или в ветке ресурсов.Утилита может обрабатывать несколько файлов параллельно.Это может быть очень требовательным к памяти, поэтому я начал вместо этого возиться с mmap целевым файлом, используя MAP_PRIVATE (я также надеялся, что mmap может завершиться ошибкой, если файл уже используется другим процессом, по крайней мере иногда).Таким образом, у меня

inBuf = mmap(NULL, filesize, PROT_READ, MAP_PRIVATE|MAP_NOCACHE, 0);

вместо

inBuf = malloc(filesize);

Использование памяти действительно меньше, но, к моему удивлению, я вижу снижение производительности: заметно более длительное время обработки, более низкая загрузка процессораи значительно большее количество основных неисправностей (согласно утилите tcsh time).Это влияние кажется более важным, когда файлы меньше, поэтому я установил произвольное ограничение (64 МБ), при котором используется исходный путь чтения malloc +.

Существует ли практическое правило для такого родакомпромисс?Я бы выполнил это через perf в Linux, но схожие утилиты, знакомые мне по Mac, все ориентированы на приложения с графическим интерфейсом (конечно, мое - это приложение оболочки).

РЕДАКТИРОВАТЬ: Если подуматьИспользование mmap (), вероятно, не уменьшит требования к памяти, не так ли?Я предполагаю, что данные по-прежнему будут копироваться в «быструю оперативную память», а не к прямому доступу на диске - и тот факт, что вы можете иметь несколько независимых mmaps одного и того же файла, кажется, подтверждает эту гипотезу: - Я получаю файлсодержимое путем преобразования его в память (см. выше inBuf) - я «hfs-compress» в этом буфере и перезаписываю файл со сжатым содержимым - inBuf не изменяется из-за перезаписи, но затем сжатые файлы HFS распаковываютсяпрозрачно при чтении - я получаю новое mmap для сжатого файла, и в качестве проверки я сравниваю это с inBuf: содержимое идентично.Но вы также ожидаете, что если эти mmaps всегда отражают содержимое файла, поэтому я не уверен, имеет ли смысл моя проверка.

...