【发布时间】:2015-03-23 14:42:24
【问题描述】:
我正在尝试对一个巨大的文件(大约 100GB)进行内存映射,以便存储具有数十亿键值对的 B-Tree。内存太小,无法将所有数据保存在内存中,因此我尝试从磁盘映射文件,而不是使用 malloc,而是返回并增加一个指向映射区域的指针。
#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。有人告诉我,可以映射大于实际内存的文件。
系统会自行管理文件,还是我只负责映射可用内存量,当访问更多空间时,我必须取消映射并映射到另一个偏移量。
谢谢
编辑
操作系统:Ubuntu 14.04 LTS x86_64
bin/washingMachine:ELF 64 位 LSB 可执行文件,x86-64,版本 1 (SYSV),动态链接(使用共享库),适用于 GNU/Linux 2.6.24,BuildID[sha1]=9dc831c97ce41b0c6a77b639121584bf76deb47d,未剥离
【问题讨论】:
-
C/C++ 不是一种语言。请更具体。
-
@dandan78 对不起。完成。
-
注意:在 mmap() 处理文件后,您可以 close() 文件描述符。
-
@KarolyHorvath 我会尝试那里提到的解决方案,如果这能解决我的问题,我会接受可能的重复。