Я пытаюсь создать карту памяти огромного файла (около 100 ГБ), чтобы сохранить B-Tree с миллиардами пар ключ-значение. Память маленькая, чтобы хранить все данные в памяти, поэтому я пытаюсь отобразить файл с диска и вместо использования malloc я возвращаю и увеличиваю указатель на отображаемую область.C - Карта памяти B-Tree
#define MEMORY_SIZE 300000000
unsigned char *mem_buffer;
void *start_ptr;
void *my_malloc(int size) {
unsigned char *ptr = mem_buffer;
mem_buffer += size;
return ptr;
}
void *my_calloc(int size, int object_size) {
unsigned char *ptr = mem_buffer;
mem_buffer += (size * object_size);
return ptr;
}
void init(const char *file_path) {
int fd = open(file_path, O_RDWR, S_IREAD | S_IWRITE);
if (fd < 0) {
perror("Could not open file for memory mapping");
exit(1);
}
start_ptr = mmap(NULL, MEMORY_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE, fd, 0);
mem_buffer = (unsigned char *) start_ptr;
if (mem_buffer == MAP_FAILED) {
perror("Could not memory map file");
exit(1);
}
printf("Successfully mapped file.\n");
}
void unmap() {
if (munmap(start_ptr, MEMORY_SIZE) < 0) {
perror("Could not unmap file");
exit(1);
}
printf("Successfully unmapped file.\n");
}
Основной метод:
int main(int argc, char **argv) {
init(argv[1]);
unsigned char *arr = (unsigned char *) my_malloc(6);
arr[0] = 'H';
arr[1] = 'E';
arr[2] = 'L';
arr[3] = 'L';
arr[4] = 'O';
arr[5] = '\0';
unsigned char *arr2 = (unsigned char *) my_malloc(5);
arr2[0] = 'M';
arr2[1] = 'I';
arr2[2] = 'A';
arr2[3] = 'U';
arr2[4] = '\0';
printf("Memory mapped string1: %s\n", arr);
printf("Memory mapped string2: %s\n", arr2);
struct my_btree_node *root = NULL;
insert(&root, arr, 10);
insert(&root, arr2, 20);
print_tree(root, 0, false);
// cin.ignore();
unmap();
return EXIT_SUCCESS;
}
Проблема заключается в том, что я получаю Cannot allocate memory
(ERRNO 12), если запрашиваемый размер больше, чем фактическая память или Segmentation fault
если запрашиваемое пространство находится за пределами отображаемой области. Мне сказали, что можно сопоставлять файлы больше, чем фактическая память.
Будет ли система управлять файлом сама по себе, или я несу ответственность за отображение только объема свободной памяти, а при доступе к дальнейшему пространству я должен размонтировать и сопоставить другое смещение.
Спасибо
EDIT
ОС: Ubuntu 14.04 LTS x86_64
бен/Стиральная машина: ELF 64-бит LSB исполняемым, x86-64, версия 1 (SYSV), динамически связаны (использует общие библиотеки), для GNU/Linux 2.6.24, BuildID [sha1] = 9dc831c97ce41b0c6a77b639121584bf76deb47d, не разделяется
C/C++ - это не язык. Пожалуйста, будьте более конкретными. – dandan78
@ dandan78 Извините. Готово. – aQuip
http://stackoverflow.com/questions/7222164/mmap-an-entire-large-file –