Как мне создать файл сопоставленного на память без заднего файла на OSX?
-
26-09-2019 - |
Вопрос
Я хочу использовать библиотеку, которая использует файловые дескрипторы в качестве основных средств для доступа к его данным. Для причин эффективности я не хочу придавать файлы на диск каждый, прежде чем я использую функции этой библиотеки.
Я хочу создать (большие) капли данных на лету и позвонить в библиотеку, чтобы отправить их на сервер. Когда он стоит, я должен написать файл на диск, откройте его, пропустите FD в библиотеку, подождите ее закончить, затем удалите файл на диске. Поскольку я могу повторно создать капли по требованию (и они не настолько большие, что они вызывают чрезмерную виртуальную память пейджинга), сохраняя их на диск ничего не покупает меня и несет большой наказание на производительность.
Можно ли присвоить FD к блоку данных, которые находятся только в качестве карта памяти?
Решение
Вы могли бы установить файловая система: http://lists.apple.com/Чахивы/darwin-kernel/2004/sep/msg00004.html.
Использование этого механизма увеличит давление памяти на систему, и, вероятно, будет выпущена, если давление памяти достаточно велико. Может быть, стоит сделать его вариантом конфигурации, если пользователь предпочел бы какое-то другое приложение имеет первый выбор памяти.
Другой вариант - использовать POSIX Общие сегменты памяти: http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html. (Я не использовал Subix Shared Segments Memory Segments; Если я их правильно понимаю, они были разработаны, чтобы решить именно эту проблему.)
То shm_open()
Функция создает объект памяти и возвращает дескриптор файла. Вы могли бы тогда mmap(2)
Этот файл дескриптор, выполните вашу работу и передайте дескриптор файла в библиотеку.
Не забудьте shm_unlink
объект, когда вы закончите; POSIX Shared Shared Memory Segments, очереди сообщений и семафорных массивов не уходят автоматически, когда последний процесс выходит.