c++ 利用内存映射读取大文件
生活随笔
收集整理的這篇文章主要介紹了
c++ 利用内存映射读取大文件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于用到的txt存放的數據有幾十萬行,用getline來讀取文件非常慢,搜索了一下可以來優化讀取文件的方法。
據說用內存映射讀取文件速度快,試了一下,但是發現要分行處理數據時,速度還是挺慢的。
有關內存映射的介紹,參考別人博客。
http://blog.csdn.net/wcyoot/article/details/7363393
/ ///創建鏡像文件來讀取文件,提高速度 /// void useMapFileReadText(){HANDLE hFile = NULL, hFileMap = NULL;char * lpbMapAddress = NULL;int nFileSize = 0, nLeftSize = 0;if(hFile == NULL){hFile = CreateFile("data.txt", GENERIC_READ, 0, NULL,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);if(hFile == INVALID_HANDLE_VALUE){printf("打開文件失敗");}}if(hFileMap == NULL){hFileMap=CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);if(hFileMap==NULL){OutputDebugString("文件鏡像句柄創建失敗!");CloseHandle(hFile);}}if(lpbMapAddress == NULL){lpbMapAddress = (char *)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);if(lpbMapAddress == NULL){OutputDebugString("內存映射文件失敗!");CloseHandle(hFileMap);CloseHandle(hFile);} }const char* buf = lpbMapAddress;const char* start = lpbMapAddress;int len;while(start != NULL){start = _get_line(buf, &len);string str(buf,len);//do something with strbuf = start;}//釋放UnmapViewOfFile(hFile); CloseHandle(hFileMap); }
其中的,_get_line 函數
'\n' 在windows中為0x0d 0x0a 占兩個字符,在linux系統中為0x0a占一個字符。
//buf:從當前地址開始搜索。 //len: 存放該行的字符串長度,不包含回車換行符。 //返回值:下一次搜索開始的地址.如果到達文件尾,則返回NULL const char* _get_line(const char* buf, int* len) {const char* tmp = buf;while(*tmp && (*tmp != 0x0d && *tmp != 0x0a && *tmp != '\n')) ++tmp;//while(*tmp && (*tmp != 0x0d || *tmp != 0x0a )) ++tmp;*len = tmp - buf; //if (*tmp == 0) return NULL;// skip New-Line charif (*tmp == 0x0d){ // Windows style New-Line 0x0d 0x0atmp += 2;//assert(*tmp == 0x0a);}//else Unix style New-Line 0x0aelse{++tmp;}return tmp; }
用十三萬多行來測試,這樣按行來處理時,不如getiline速度快。
內存映射的優勢還是在于大文件。
fstream.open() 時,由于文件太大,IO一次讀不了所有的數據,需要多次IO操作。
而內存映射,并不是將文件加載到內存。內存映射首先申請一段地址空間,并映射到物理存儲器,而這里的物理存儲器就是文件所在的磁盤,類似虛擬內存(pagefile);
當有需要時,程序不需要先把它加到內存,而是直接從磁盤讀取。這樣就減少了IO操作。
?內存映射的一個優勢還在于多個進程之間共享數據。?
總結
以上是生活随笔為你收集整理的c++ 利用内存映射读取大文件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ofstream写不进txt文件的奇怪问
- 下一篇: map的内存释放问题