c++ windows下读取大文件(内存映射)
关于内存映射的基本知识以及一些函数的原型说明,参考博客:http://blog.csdn.net/wcyoot/article/details/7363393
下面是我对于读取一个104M文件大小,使用内存映射和传统的读文件方法进行了时间上的对比,两种方法都从该文讲读取300000*34个浮点数。
测试环境:vs2010
- #include<iostream>
- #include <cstringt.h>
- #include<vector>
- #include<windows.h>
- #include <ctime>
- using namespace std;
- int main()
- {
- clock_t start, finish;
- //------------------------------------------------------内存映射方法;
- start = clock();
- //创建或打开文件内核对象;
- HANDLE fileH = CreateFile("ldFeature.txt",
- GENERIC_READ|GENERIC_WRITE,
- FILE_SHARE_READ,
- NULL,
- OPEN_EXISTING,
- FILE_ATTRIBUTE_NORMAL,
- NULL);
- if(fileH == INVALID_HANDLE_VALUE)
- {
- cout<<"error in CreateFile"<<endl;
- return -;
- }
- //创建一个文件映射内核对象;
- HANDLE mapFileH = CreateFileMapping( fileH,
- NULL,
- PAGE_READWRITE,
- ,
- ,
- "Resource " );
- if(mapFileH == NULL)
- {
- cout<<"error in CreateFileMapping"<<endl;
- return -;
- }
- //将文件数据映射到进程的地址空间;
- char * mapH = (char *)MapViewOfFile( mapFileH,
- FILE_MAP_ALL_ACCESS,
- ,
- ,
- );
- if(mapH == NULL)
- {
- cout<<"error in MapViewOfFile"<<endl;
- return -;
- }
- //读取数据;
- char *buf = mapH;
- double k;
- int times = *;
- for(int i = ; i <= times; i++)
- {
- k = atof(buf);
- buf = strstr(buf+," ");
- //cout<<k<<endl;
- }
- //关闭句柄;
- UnmapViewOfFile(mapH);
- CloseHandle(mapFileH);
- CloseHandle(fileH);
- finish = clock();
- //打印耗时;
- cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl;
- //------------------------------------------------------传统方法;
- start = clock();
- FILE *fp = fopen("ldFeature.txt","r");
- if(fp == NULL)
- {
- cout<<"error in fopen"<<endl;
- return -;
- }
- for(int i = ;i <= times; i++)
- {
- fscanf(fp,"%lf",&k);
- }
- fclose(fp);
- finish = clock();
- cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl;
- return ;
- }
结果显示,传统方法耗时是内存映射方法的2倍左右。实际上文件越大,使用内存映射方法的优势越明显:
【版权声明】转载请注明出处 http://www.cnblogs.com/TenosDoIt/p/3157596.html
c++ windows下读取大文件(内存映射)的更多相关文章
- 解决java读取大文件内存溢出问题
1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new ...
- mysql windows 下导入大文件
先进入你的mysql bin目录 cd D:/php/mysql/bin 输入命令 mysql -u 用户名 -p 密码 数据库名 < 文件路径 ...
- windows下读取utf-8文件
#include <stdio.h> #include <tchar.h> #include <memory> int main() { FILE* fp1 = f ...
- iOS将大文件映射到内存(读取大文件)
http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...
- java大文件读写操作,java nio 之MappedByteBuffer,高效文件/内存映射
java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...
- Python读取大文件的"坑“与内存占用检测
python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录一次踩坑历程,并且给了一些总结,希望到大家在使用python的过程之中,能够避免一些可能产生隐患的代码. 1. ...
- Java多线程读取大文件
前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...
- java 分次读取大文件的三种方法
1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...
- PHP如何快速读取大文件
在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...
随机推荐
- iOS6新特征:UICollectionView介绍-非常棒 -转
传送门:http://www.devdiv.com/forum.php?mod=viewthread&tid=128378
- ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?
背景 Mvc 提供了一种可扩展的模型绑定机制,具体来说就是:将客户端传递的参数按照一定的策略绑定到 action 的参数上,这带来的直接好处就是让 action 的参数支持强类型.一般来说我们有如下方 ...
- python测试开发django-33.admin后台一对一关系OneToOneField
前言 假如有一张表(Card)记录用户的卡号信息和用户名,现在需要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息. 为了不影响原来的表设计,可以新增一张表(CardDetail),专门记录用户 ...
- Android 百度地图开发(三)
实现比例尺功能和替换自带的缩放组件 ScaleView是比例尺控件.ZoomControlView是缩放控件,MainActivity就是我们的主界面了 先看下ZoomControlView类.代码例 ...
- SharePoint Online 创建和使用视图
前言 本文介绍如何在Office 365中创建和使用视图. 正文 首先,解释一下什么是SharePoint站点视图,所谓视图,就是列表的一个呈现形式,包含特定的栏.排序.筛选.分组等特性,我们通常创建 ...
- Javascript与Objective-C 字符串与数组的方法类比
table {border-collapse:collapse;} table td {border:1px solid #ccc;} String vs NSString JavaScript st ...
- 简析Window、Activity、DecorView以及ViewRoot之间的错综关系
一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...
- java转义符和正则表达式转义符
举例来说,连续相同的3位数字的正则表达式的标准语法是: ([\d])\1{2} 但是如果在java代码中这么写,就会出现语法错误,如下: String regEx = "([\d])\1{2 ...
- 微信二维码扫描无法下载APK文件的解决办法
- 洛谷 P1164 小A点菜
题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...