Рассматривая каждый вопрос по очереди
- Это очень плохая идея? Знаете ли вы что-нибудь лучше, чтобы достичь того же?
Не совсем понятно, чего вы надеетесь достичь этим. Linux уже поддерживает память, используемую пространством подкачки (поэтому, если ваши данные превышают физическую память, некоторые из них будут перенесены на диск). У вас проблемы с нехваткой адресного пространства или медленная работа из-за чрезмерного подкачки? Использование хранилища, поддерживаемого mmap, также не повлияет.
- Нужно ли заранее выделять максимальный размер файла и потребуется ли все это пространство на диске? Если да, поможет ли сопоставление с разреженным файлом?
Да, файл должен быть таким же большим, как пространство, которое вы создаете. Тем не менее, вы можете начать с небольшого файла / mmap и при необходимости увеличить его (и дополнительные страницы mmap). Вы также можете использовать разреженный файл, чтобы дисковое пространство не использовалось до тех пор, пока страницы не будут записаны.
- Я не хочу писать свой собственный распределитель кучи. Могу ли я использовать существующий?
Существуют диспетчеры кучи, которые используют хранилище с поддержкой mmap. Я видел версии malloc Doug Lea и других распределителей bibop, которые делают это.
- Когда моя программа завершит работу, файл mmap'd будет удален. Это означает, что я не хочу, чтобы какие-либо страницы записывались на диск, если ядро фактически не удалит их из памяти. Есть ли что-то вроде ленивого флага в mmap для достижения этого или это автоматически?
В этом случае вы можете просто использовать MAP_ANON и вообще не иметь файла. Тем не менее, это возвращает нас к первому вопросу, поскольку по сути дублирует то, что делает система malloc (и new). На самом деле на некоторых ОС (Solaris?) Это именно то, что делает система malloc. Основная причина, по которой я видел пользовательские mallocs на основе mmap в прошлом, заключается в постоянном хранении (поэтому файл останется после завершения процесса и будет переназначен при перезапуске).