本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

c++ windows下读取大文件(内存映射)

关于内存映射的基本知识以及一些函数的原型说明,参考博客:http://blog.csdn.net/wcyoot/article/details/7363393

下面是我对于读取一个104M文件大小,使用内存映射和传统的读文件方法进行了时间上的对比,两种方法都从该文讲读取300000*34个浮点数。

测试环境:vs2010

 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 }
View Code

结果显示,传统方法耗时是内存映射方法的2倍左右。实际上文件越大,使用内存映射方法的优势越明显:

【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3157596.html

posted @ 2013-06-26 22:12  tenos  阅读(12249)  评论(0编辑  收藏  举报

本博客rss订阅地址: http://feed.cnblogs.com/blog/u/147990/rss

公益页面-寻找遗失儿童