mmap
- лучший способ справиться с большим объемом данных, хранящихся в файле, если вам нужен произвольный доступ к этим данным.
mmap
говорит системе виртуальной памяти сопоставлять непрерывную часть адресного пространства с данными, найденными в файле. Система виртуальной памяти выделит диапазон адресного пространства, поддерживаемый этим файлом. Когда вы получаете доступ к любому местоположению в этом адресном пространстве, он выделяет страницу физической памяти, считывает этот раздел файла с диска и указывает эту часть вашего виртуального адресного пространства на физическую память, которую он использовал для чтения файла. , Когда ему необходимо освободить место в физической памяти, он запишет все изменения на диск (если применимо) и удалит сопоставление этого раздела виртуального адресного пространства.
Вы бы использовали это так:
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/mman.h> /* the header where mmap is defined */
#include <fcntl.h>
int file;
char *contents;
struct stat statbuf;
off_t len;
file = open("path/to/file", O_RDONLY);
if (file < 0)
exit(1); /* or otherwise handle the error */
if (fstat(file, &statbuf) < 0)
exit(1);
len = statbuf.st_size;
contents = mmap(0, len, PROT_READ, MAP_SHARED, file, 0);
if (contents == MAP_FAILED)
exit(1);
// Now you can use contents as a pointer to the contents of the file
// When you're done, unmap and close the file.
munmap(contents, len);
close(file);