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
转载于:https://www.cnblogs.com/TenosDoIt/p/3157596.html
c++ windows下读取大文件(内存映射)相关推荐
- python读取视频占用内存太大_Python 读取大文件内存占用检测示例
导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...
- 巧用Linux 命令来拆分Windows下的大文件
背景: 今天在处理SQL Server一个同步链的问题,源头目的端比较数据,最后产生了一个300MB的文件,在windows下根本没办法打开.而且就算可以打开,也需要在每1000条命令后,等待10秒钟 ...
- python读取大文件内存不够_大型CSV文件(numpy)上的Python内存不足
正如其他人所提到的,对于一个很大的文件,最好不进行迭代. 但是,出于各种原因,您通常确实希望将整个内容存储在内存中. genfromtxt效率要低得多loadtxt(尽管它可以处理丢失的数据,而效率更 ...
- php yield 导出文件,PHP yield 读取大文件
今天来优化下读取大文件,在 PHP 读取大文件的时候,经常会出现内存不足的情况,如果文件过大的话,没法一次读取完,今天采用 yield 来实现大文件的读取.yield生成器是php5.5之后出现的,y ...
- C语言读取大文件的问题 内存映射
2019独角兽企业重金招聘Python工程师标准>>> [Ref] Windows对文件的读写提供了很丰富的操作手段,如: 1. FILE *fp, fstearm...; (C/C ...
- java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
http://langgufu.iteye.com/blog/2107023 java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果 ...
- Windows/Linux上使用fopen相关函数读取大文件
在介绍读取大文件之前,先了解下<cstdint>文件,标准头文件,存放固定宽度整数类型,如int32_t, uint32_t,不管在32位上还是64位上,长度都为4个字节:int64_t, ...
- 如何在不会导致服务器宕机的情况下,用 PHP 读取大文件
来自:开源中国 www.oschina.net/translate/performant-reading-big-files-php 作为PHP开发人员,我们并不经常需要担心内存管理.PHP 引擎在我 ...
- Python读取大文件的坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑". 笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. r ...
- python读取大文件的坑_Python读取大文件的坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
最新文章
- tensorflow tf.keras.losses.MeanSquaredError 均方差损失函数 示例
- shell脚本 逐行读取文本并且 进行字符串的截取
- js blob 下载到本地文件
- 【Python】统计字符串里某个字符或子字符串出现的次数
- 图像处理中ct图的通道是多少_常见医疗扫描图像处理步骤
- mysql物流管理系统_wuliuwang 物流信息管理系统 ssh2 mysql(Logistics Information Management System) - 下载 - 搜珍网...
- 40个最好的Tumblr主题
- 【渝粤题库】陕西师范大学165209 组织职业生涯管理 作业(专升本)
- [译]5 Mac OS X RSS Readers Worth Giving a Shot
- Spring MVC 流程图解析
- 数据分析来诠释985/211废物的焦虑与失意
- Linux 启动顺序
- 颇有微词 小模式 大蓝海 by 曹继忠 - 2013中国SEO排行榜
- 在DSP28335上使用RTOS的经验总结
- 拼多多砍价小程序源码-带搭建教程-可开流量主
- LibXL 算法分析(附注册机)
- 阿里云ACP大数据工程师认证,ACP,阿里云ACP认证,阿里云认证,大数据工程师认证
- php在fpm运行模式下实现服务之间的服务熔断、服务监控、调用日志
- 分享 tsc 条码打印机 打印控件 调用方法 , c# silverlight
- 【电源】【PCB】电源板(提供±2v5,3v3,5v,12v供电)的制作——电赛使用
热门文章
- jQuery基础知识--Form基础(续)
- php获取当前url完整地址
- HttpRequest类
- 解析Web应用服务四大弱点
- HDU3032 Nim or not Nim?
- HDU2147 kiki's game
- Ajax学习笔记-客户端模板引擎-9
- windows powershell 没有vi_「PowerShell」人人都值得学一点PowerShell实现自动化(2)
- java中的servlet_关于JavaWeb中Servlet的总结
- html不支持js,解决Firefox不支持Js的InnerHtml问题