關於內存映射的基本知識以及一些函數的原型說明,參考博客:http://blog.csdn.net/wcyoot/article/details/7363393html
下面是我對於讀取一個104M文件大小,使用內存映射和傳統的讀文件方法進行了時間上的對比,兩種方法都從該文講讀取300000*34個浮點數。ios
測試環境:vs2010windows
1 #include<iostream> 2 #include <cstringt.h> 3 #include<vector> 4 #include<windows.h> 5 #include <ctime> 6 using namespace std; 7 8 9 10 11 int main() 12 { 13 clock_t start, finish; 14 //------------------------------------------------------內存映射方法; 15 start = clock(); 16 //建立或打開文件內核對象; 17 HANDLE fileH = CreateFile("ldFeature.txt", 18 GENERIC_READ|GENERIC_WRITE, 19 FILE_SHARE_READ, 20 NULL, 21 OPEN_EXISTING, 22 FILE_ATTRIBUTE_NORMAL, 23 NULL); 24 if(fileH == INVALID_HANDLE_VALUE) 25 { 26 cout<<"error in CreateFile"<<endl; 27 return -1; 28 } 29 30 //建立一個文件映射內核對象; 31 HANDLE mapFileH = CreateFileMapping( fileH, 32 NULL, 33 PAGE_READWRITE, 34 0, 35 0, 36 "Resource " ); 37 if(mapFileH == NULL) 38 { 39 cout<<"error in CreateFileMapping"<<endl; 40 return -1; 41 } 42 43 //將文件數據映射到進程的地址空間; 44 char * mapH = (char *)MapViewOfFile( mapFileH, 45 FILE_MAP_ALL_ACCESS, 46 0, 47 0, 48 0); 49 if(mapH == NULL) 50 { 51 cout<<"error in MapViewOfFile"<<endl; 52 return -1; 53 } 54 55 //讀取數據; 56 char *buf = mapH; 57 double k; 58 int times = 300000*34; 59 for(int i = 1; i <= times; i++) 60 { 61 k = atof(buf); 62 buf = strstr(buf+9," "); 63 //cout<<k<<endl; 64 } 65 //關閉句柄; 66 UnmapViewOfFile(mapH); 67 CloseHandle(mapFileH); 68 CloseHandle(fileH); 69 70 finish = clock(); 71 //打印耗時; 72 cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl; 73 74 //------------------------------------------------------傳統方法; 75 start = clock(); 76 77 FILE *fp = fopen("ldFeature.txt","r"); 78 if(fp == NULL) 79 { 80 cout<<"error in fopen"<<endl; 81 return -1; 82 } 83 for(int i = 1 ;i <= times; i++) 84 { 85 fscanf(fp,"%lf",&k); 86 } 87 fclose(fp); 88 89 finish = clock(); 90 cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl; 91 92 93 return 0; 94 }
結果顯示,傳統方法耗時是內存映射方法的2倍左右。實際上文件越大,使用內存映射方法的優點越明顯:app
【版權聲明】轉載請註明出處 http://www.cnblogs.com/TenosDoIt/p/3157596.htmlide