В Solaris 10, а также в Linux я использую вызов mmap для создания файла отображения памяти и последующего чтения файла из отдельного процесса. Для большого файла с отображенной памятью во время чтения (без записи) я получаю ENOMEM. В чем может быть причина, а что может быть решением проблемы или путем? Я думал, что отображенный в память файл не занимает память полностью.
Я использую следующий вызов:
char * segptr = (char *) mmap(0,sz,PROT_READ | PROT_WRITE,MAP_SHARED,fd,0);
где,sz
это размер файла и fd
дескриптор файла, открытого через open
Я получаю сбой ENOMEM при попытке зарезервировать место для целиком.
ulimit -a
показывает:
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
open files (-n) 256
pipe size (512 bytes, -p) 10
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 29995
virtual memory (kbytes, -v) unlimited
Могу ли я отобразить частичный файл? Если я открою частичный файл, смогу ли я получить доступ ко всему содержимому по требованию? Я не пользовалась setrlimit чтобы установить какой-либо предел, так что я думаю, используя значение по умолчанию (не знаю, что по умолчанию), я должен увеличить это? Пожалуйста, руководство.
Как мне отобразить файл небольшими порциями, чтобы сэкономить использование памяти и, таким образом, избежать ENOMEM?
Задача ещё не решена.
Других решений пока нет …