内存映射文件的方法
Posted hatsusakana
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存映射文件的方法相关的知识,希望对你有一定的参考价值。
内存映射文件的方法
-----------------------------------------------------
Windows采用MapViewOfFile系统api,Linux则采用mmap相关函数。
之前在做大数据查询计算的时候,经常会出现内存不足的情况,malloc无法分配内存了。
那时候就经常在想能不能使用硬盘来充当内存,就像swap交换那样,硬盘是非常大的,如
果能使用硬盘来当内存也许速度会慢一点,但是内存问题就不需要再担心了。之后研究了
一段时间发现,内存映射文件依然是将整个文件映射到内存里,所以:
内存映射文件是无法利用文件来节省内存的!!
-----------------------------------------------------
Windows Demo:
#include <stdio.h> #include <windows.h> #define MMAP_ALLOCATOR_SIZE 1024 int main (int argc, char *argv[]) { HANDLE dumpFileDescriptor = CreateFile("1.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); printf("dumpFileDescriptor=%d ", dumpFileDescriptor); HANDLE fileMappingObject = CreateFileMapping(dumpFileDescriptor, NULL, PAGE_READWRITE, 0, MMAP_ALLOCATOR_SIZE, NULL); printf("fileMappingObject=%d ", fileMappingObject); char* mappedFileAddress = (char *)MapViewOfFile(fileMappingObject, FILE_MAP_ALL_ACCESS, 0, 0, MMAP_ALLOCATOR_SIZE); printf("mappedFileAddress=%d ", mappedFileAddress); memset(mappedFileAddress, 0, MMAP_ALLOCATOR_SIZE); sprintf(mappedFileAddress, "10086"); printf("mappedFileAddress=%s ", mappedFileAddress); FlushViewOfFile(mappedFileAddress, MMAP_ALLOCATOR_SIZE); UnmapViewOfFile(mappedFileAddress); CloseHandle(fileMappingObject); CloseHandle(dumpFileDescriptor); unlink("1.txt"); return 1; }
------------------------------------------------------------------
Linux Demo:
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #include <fcntl.h> #include <unistd.h> #include <sys/stat.h> #include <unistd.h> #define MMAP_ALLOCATOR_SIZE 65535 int main(int argc, char *argv[]) { struct stat statbuf; int fd; char *buf; int i; fd = open("1.txt", O_CREAT|O_RDWR, 0755); if (fd == -1) { printf("fail to open "); exit(1); } ftruncate(fd, MMAP_ALLOCATOR_SIZE); buf = (char *)mmap(NULL, MMAP_ALLOCATOR_SIZE, PROT_READ|PROT_WRITE, MAP_PRIVATE, fd, 0); if (buf == MAP_FAILED) { printf("fail to open "); exit(1); } memset(buf, 0, MMAP_ALLOCATOR_SIZE); sprintf(buf, "10086"); msync(buf, MMAP_ALLOCATOR_SIZE, MS_SYNC); printf("buf=%s ", buf); if (munmap(buf, MMAP_ALLOCATOR_SIZE) == -1) { printf("fail to munmap "); exit(1); } close(fd); return 1; }
相关连接:
https://blog.csdn.net/qq_33611327/article/details/81738195
以上是关于内存映射文件的方法的主要内容,如果未能解决你的问题,请参考以下文章
Linux 内核 内存管理内存管理系统调用 ④ ( 代码示例 | mmap 创建内存映射 | munmap 删除内存映射 )
Linux 内核 内存管理内存管理系统调用 ⑤ ( 代码示例 | 多进程共享 mmap 内存映射示例 )
14.VisualVM使用详解15.VisualVM堆查看器使用的内存不足19.class文件--文件结构--魔数20.文件结构--常量池21.文件结构访问标志(2个字节)22.类加载机制概(代码片段