日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++ 利用内存映射读取大文件

發布時間:2025/3/21 c/c++ 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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++ 利用内存映射读取大文件的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。