2010-09-01 1 views
2

Я хочу использовать библиотеку, которая использует файловые дескрипторы в качестве основного средства для доступа к своим данным. По соображениям производительности, я не хочу, чтобы каждый раз записывать файлы на диск, прежде чем использовать функции этой библиотеки.Как создать файл с отображением памяти без файла резервной копии на OSX?

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

Можно ли назначить FD блоку данных, который находится только как объект с отображением памяти?

+0

Возможно, нет никакого способа сделать это. Но посмотрите на этот вопрос: http://stackoverflow.com/questions/2822040/system-call-to-map-memory-to-a-file-descriptor-inverse-mmap – Sven

ответ

3

Вы можете смонтировать памяти спинками файловой системы: http://lists.apple.com/archives/darwin-kernel/2004/Sep/msg00004.html

Используя этот механизм будет увеличивать давление памяти в системе, и, вероятно, будет выгружен, если давление памяти достаточно велик. Возможно, стоит сделать его вариантом конфигурации, если пользователь предпочел бы, чтобы какое-то другое приложение имело первый выбор памяти.

Другой вариант заключается в использовании POSIX разделяемых сегментов памяти: http://opengroup.org/onlinepubs/007908799/xsh/shm_open.html (я не использовал сегменты совместно памяти POSIX себя, если я их понимаю правильно, они были разработаны, чтобы решить именно эту проблему.)

Функция shm_open() создает объект памяти и возвращает дескриптор файла. Вы могли бы затем mmap(2) описать этот файл, выполнить свою работу и передать файловый дескриптор в библиотеку.

Не забудьте указать shm_unlink объект, когда вы закончите; Сегменты разделяемой памяти POSIX, очереди сообщений и массивы семафоров автоматически не уходят, когда последний процесс завершается.

+0

Ага! shm_open() - именно то, что мне нужно. Благодаря! – Enquimot

+0

@Mouviciel, спасибо за исправление: D хочу, чтобы я мог изменить голос. – sarnold

+1

Может понадобиться поэкспериментировать с этим, так как пока OS X поддерживает POSIX, вам может потребоваться настроить параметры ядра, чтобы иметь возможность назначать разумные объемы разделяемой памяти. В зависимости от вашего приложения это может быть или не быть приемлемым (т. Е. У меня нет проблем с настройкой параметров для запуска postgres или Oracle, но большинство конечных пользователей ожидают установки нуля при установке). – JulesLt

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