关于内存映射的基本知识以及一些函数的原型说明,参考博客: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

转载于:https://www.cnblogs.com/TenosDoIt/p/3157596.html

c++ windows下读取大文件(内存映射)相关推荐

  1. python读取视频占用内存太大_Python 读取大文件内存占用检测示例

    导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...

  2. 巧用Linux 命令来拆分Windows下的大文件

    背景: 今天在处理SQL Server一个同步链的问题,源头目的端比较数据,最后产生了一个300MB的文件,在windows下根本没办法打开.而且就算可以打开,也需要在每1000条命令后,等待10秒钟 ...

  3. python读取大文件内存不够_大型CSV文件(numpy)上的Python内存不足

    正如其他人所提到的,对于一个很大的文件,最好不进行迭代. 但是,出于各种原因,您通常确实希望将整个内容存储在内存中. genfromtxt效率要低得多loadtxt(尽管它可以处理丢失的数据,而效率更 ...

  4. php yield 导出文件,PHP yield 读取大文件

    今天来优化下读取大文件,在 PHP 读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,今天采用 yield 来实现大文件的读取.yield生成器是php5.5之后出现的,y ...

  5. C语言读取大文件的问题 内存映射

    2019独角兽企业重金招聘Python工程师标准>>> [Ref] Windows对文件的读写提供了很丰富的操作手段,如: 1. FILE *fp, fstearm...; (C/C ...

  6. java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射

    http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...

  7. Windows/Linux上使用fopen相关函数读取大文件

    在介绍读取大文件之前,先了解下<cstdint>文件,标准头文件,存放固定宽度整数类型,如int32_t, uint32_t,不管在32位上还是64位上,长度都为4个字节:int64_t, ...

  8. 如何在不会导致服务器宕机的情况下,用 PHP 读取大文件

    来自:开源中国 www.oschina.net/translate/performant-reading-big-files-php 作为PHP开发人员,我们并不经常需要担心内存管理.PHP 引擎在我 ...

  9. Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑". 笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. r ...

  10. python读取大文件的坑_Python读取大文件的坑“与内存占用检测

    python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...

最新文章

  1. tensorflow tf.keras.losses.MeanSquaredError 均方差损失函数 示例
  2. shell脚本 逐行读取文本并且 进行字符串的截取
  3. js blob 下载到本地文件
  4. 【Python】统计字符串里某个字符或子字符串出现的次数
  5. 图像处理中ct图的通道是多少_常见医疗扫描图像处理步骤
  6. mysql物流管理系统_wuliuwang 物流信息管理系统 ssh2 mysql(Logistics Information Management System) - 下载 - 搜珍网...
  7. 40个最好的Tumblr主题
  8. 【渝粤题库】陕西师范大学165209 组织职业生涯管理 作业(专升本)
  9. [译]5 Mac OS X RSS Readers Worth Giving a Shot
  10. Spring MVC 流程图解析
  11. 数据分析来诠释985/211废物的焦虑与失意
  12. Linux 启动顺序
  13. 颇有微词 小模式 大蓝海 by 曹继忠 - 2013中国SEO排行榜
  14. 在DSP28335上使用RTOS的经验总结
  15. 拼多多砍价小程序源码-带搭建教程-可开流量主
  16. LibXL 算法分析(附注册机)
  17. 阿里云ACP大数据工程师认证,ACP,阿里云ACP认证,阿里云认证,大数据工程师认证
  18. php在fpm运行模式下实现服务之间的服务熔断、服务监控、调用日志
  19. 分享 tsc 条码打印机 打印控件 调用方法 , c# silverlight
  20. 【电源】【PCB】电源板(提供±2v5,3v3,5v,12v供电)的制作——电赛使用

热门文章

  1. jQuery基础知识--Form基础(续)
  2. php获取当前url完整地址
  3. HttpRequest类
  4. 解析Web应用服务四大弱点
  5. HDU3032 Nim or not Nim?
  6. HDU2147 kiki's game
  7. Ajax学习笔记-客户端模板引擎-9
  8. windows powershell 没有vi_「PowerShell」人人都值得学一点PowerShell实现自动化(2)
  9. java中的servlet_关于JavaWeb中Servlet的总结
  10. html不支持js,解决Firefox不支持Js的InnerHtml问题