急切求教超大文件的读写解决办法
急切求教超大文件的读写
超过4G以上的大文件,用常规方式读取就不行了,这两天查了下,
主要用:createFileMapping和mapviewofFile进行读,请问这两个函数该如果具体操作呢?
还有就是我如果想把文件里面我想要的某行,提取出来,该用那个函数储存呢?
比如我要第1行,第3行,每读到一行想要的,该如何储存在我另外一个文本中呢?
------解决方案--------------------
CreateFile打开一个文件,把文件句柄交给CreateFileMapping建立一个映射对象。
通过映射对象可以调用MapViewOfFile把文件映射到内存地址上,这样你就可以通过访问内存直接读到文件的数据。
直接用ReadFile一样可以读超过4G的文件,除非你的文件系统不支持超过4G的文件。file mapping的好处仅仅在于如果你需要随机读取文件内容通过file mapping可以直接使用Windows系统的虚拟内存缓冲机制。
------解决方案--------------------
超过4G以上的大文件,用常规方式读取就不行了,这两天查了下,
主要用:createFileMapping和mapviewofFile进行读,请问这两个函数该如果具体操作呢?
还有就是我如果想把文件里面我想要的某行,提取出来,该用那个函数储存呢?
比如我要第1行,第3行,每读到一行想要的,该如何储存在我另外一个文本中呢?
------解决方案--------------------
CreateFile打开一个文件,把文件句柄交给CreateFileMapping建立一个映射对象。
通过映射对象可以调用MapViewOfFile把文件映射到内存地址上,这样你就可以通过访问内存直接读到文件的数据。
直接用ReadFile一样可以读超过4G的文件,除非你的文件系统不支持超过4G的文件。file mapping的好处仅仅在于如果你需要随机读取文件内容通过file mapping可以直接使用Windows系统的虚拟内存缓冲机制。
------解决方案--------------------
- C/C++ code
#include <windows.h> #include <stdio.h> #include <tchar.h> int _tmain(int argc, _TCHAR *argv[]) { HANDLE hFile; HANDLE hFMap; hFile = CreateFile( L"E:\\map.bin", GENERIC_READ|GENERIC_WRITE, // 可读可写 0, NULL, CREATE_ALWAYS, // 总是建立新文件 0, NULL ); if (INVALID_HANDLE_VALUE == hFile) { _tprintf(_T("CreateFile() failed. code:%d\n"), GetLastError()); } else { hFMap = CreateFileMapping( // 创建文件映射 hFile, NULL, PAGE_READWRITE, // 读写 1, // 4GB 0, // 0x1 0000 0000 bytes= 2^32 bytes = 4GB NULL ); if (INVALID_HANDLE_VALUE != hFMap) { PBYTE p = (PBYTE)MapViewOfFile( // 映射到进程空间 hFMap, FILE_MAP_WRITE, 0, 0, 1024 // 1K 大小 ); if (p != NULL) { memset(p, 0xFF, 1024); // 设置为0xFF UnmapViewOfFile(p); } } CloseHandle(hFMap); CloseHandle(hFile); } return 0; }
------解决方案--------------------
直接fopen()后,fread()就是,设置读取偏移用:
_fseeki64()
获取文件长度用
_filelengthi64(m_pFile->_file)
------解决方案--------------------
再次强调,mapping适合随机读写,不适合超大文件,如果你没办法一次性将文件全部映射,用mapping其实很麻烦
mapping的顺序读写效率和普通IO没有本质区别,随机读写的话,mapping可以直接寻址定位,比普通io的设置偏移要简单高效