windows中内存映射文件
Windows上,内存映射文件,使得大文件的读写不会消耗太多的内存,也减少了频繁的cpu指令。另外,windows上的进程间共享数据,也是通过内存映射文件的方式来实现。
刚好又遇到这个需求,需要在服务器上一次载入几十兆大小的文件,每个文件大约有100万条数据。所以温习一下这块内容。
使用内存映射文件,需要按下列操作步骤操作:
1,打开一个文件对象,也就是文件句柄了。
2,创建一个文件映射对象 。
3,获取文件映射对象在进程地址空间的指针。
当完成对内存映射文件操作时,执行下面这些步骤清理内存:
1,告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2,关闭文件映射对象。
3,关闭文件句柄。
内存映射可以高效的对大文件进行读写操作,可以这样理解,这个文件在物理磁盘上的存储空间被作为虚拟内存使用了,你读写这块内存区域,就相当于读写文件。在效率上,比I/O文件系统高了很多。win32上的进程间消息传递SendMessage和PostMessage都是用到这种方法。
实际上如果只是单纯使用它,就不必深究原理,否则需要去看《Windows核心编程》。
代码是硬道理:
假设在E盘有一个测试文件test.txt,内容如下:
#include "windows.h"
#include "stdio.h"
int main()
{
//文件对象
TCHAR STR[] = "hello world!";
HANDLE hFile = CreateFile("E:\\test.txt",
GENERIC_READ | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//映射对象
HANDLE hFileMapping = CreateFileMapping(hFile,
NULL,
PAGE_READWRITE,
0,
0,
NULL);
//这里赋值了2个文件映射的指针,地址从文件头开始
TCHAR *pbFile1 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
TCHAR *pbFile2 = (TCHAR *)MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);
/*
输出字符串的内容,可以看到的是,把整个文件当作字符串输出了。
当然,如果文件中含有'\0'的字符,你看不到全部文件内容的输出。
*/
//两个输出的结果是一样的
printf("%s\n", pbFile1);
printf("%s\n", pbFile2);
/*
下面的操作是往这个pbFile1指向的地址写入点自定义的内容,
然后比较pbFile2指向地址的值是否相应改变了。
*/
memcpy(pbFile1, STR, strlen(STR));
printf("%s\n", pbFile1);
printf("%s\n", pbFile2);
//清理指针和内存
UnmapViewOfFile(pbFile1);
UnmapViewOfFile(pbFile2);
CloseHandle(hFileMapping);
CloseHandle(hFile);
return 0;
}
相关新闻>>
- 发表评论
-
- 最新评论 更多>>