关于内存映射的基本知识以及一些函数的原型说明,参考博客: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下读取大文件(内存映射)的更多相关文章

  1. 解决java读取大文件内存溢出问题

    1. 传统方式:在内存中读取文件内容 读取文件行的标准方式是在内存中读取,Guava 和Apache Commons IO都提供了如下所示快速读取文件行的方法: Files.readLines(new ...

  2. mysql windows 下导入大文件

    先进入你的mysql bin目录 cd D:/php/mysql/bin 输入命令 mysql -u 用户名 -p 密码 数据库名 < 文件路径                          ...

  3. windows下读取utf-8文件

    #include <stdio.h> #include <tchar.h> #include <memory> int main() { FILE* fp1 = f ...

  4. iOS将大文件映射到内存(读取大文件)

    http://blog.csdn.net/xyt243135803/article/details/40995759 在<中国区GPS偏移纠正(适用于Google地图)>一文中曾读取一个7 ...

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

    java处理大文件,一般用BufferedReader,BufferedInputStream这类带缓冲的Io类,不过如果文件超大的话,更快的方式是采用MappedByteBuffer. Mapped ...

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

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

  7. Java多线程读取大文件

    前言 今天是五一假期第一天,按理应该是快乐玩耍的日子,但是作为一个北漂到京师的开发人员,实在难想出去那玩耍.好玩的地方比较远,近处又感觉没意思.于是乎,闲着写篇文章,总结下昨天写的程序吧. 昨天下午朋 ...

  8. java 分次读取大文件的三种方法

    1. java 读取大文件的困难 java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&qu ...

  9. PHP如何快速读取大文件

    在PHP中,对于文件的读取时,最快捷的方式莫过于使用一些诸如file.file_get_contents之类的函数,简简单单的几行代码就能 很漂亮的完成我们所需要的功能.但当所操作的文件是一个比较大的 ...

随机推荐

  1. firedac连接linux的oracle

    firedac连接linux的oracle 首先要下载并安装 oci for linux.OCI的版本要和ORACLE数据库的版本一致. centos7环境下安装OCI:https://blog.cs ...

  2. ECShop 调用自定义广告

    原文地址:http://www.ecshoptemplate.com/article-1348.html ECShop中关于广告的调用方法,网上有很多,现在要介绍的不同于其他,根据实际情况选择使用,以 ...

  3. WordPress主题开发:优化标题

    页面使用: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...

  4. 使用PHP+Sphinx建立高效的站内搜索引擎

      1.    为什么要使用Sphinx   假设你现在运营着一个论坛,论坛数据已经超过100W,很多用户都反映论坛搜索的速度非常慢,那么这时你就可以考虑使用Sphinx了(当然其他的全文检索程序或方 ...

  5. 让Java和JavaScript进行交互

    本篇博文参考自:http://droidyue.com/blog/2014/09/20/interaction-between-java-and-javascript-in-android/ 我们在使 ...

  6. 开源项目MultiChoiceAdapter详解(六)——GridView和MultiChoiceBaseAdapter配合使用

    这篇其实没啥重要的,主要就算是个总结吧. 一.布局文件 这里实现的是类似于上图的多图选择的效果.关键在于item布局文件的写法.这也就是这个框架奇葩的一点,莫名其妙的要在一个自定义控件里面再放一个自定 ...

  7. dubbo源码解析-spi(一)

    前言 虽然标题是dubbo源码解析,但是本篇并不会出现dubbo的源码,本篇和之前的dubbo源码解析-简单原理.与spring融合一样,为dubbo源码解析专题的知识预热篇. 插播面试题 你是否了解 ...

  8. 让Windows加入域的PowerShell

    $domain = "midrange.lab" $password = "MyPassword!" | ConvertTo-SecureString -asP ...

  9. 如何在Vblock里配置Boot from SAN

    啥是vBlock ============ vBlock是VCE用在包含了它的数据中心产品的组件的机架上的一个商标名. 机架中的组件都是有VCE出厂前预先组装好的, 组件的预设以及解决方案, 都是客户 ...

  10. 记录Activity启动时间 ActivityLifecycleCallbacks

    ActivityStackManager 定义一个集合(Stack)保存所有还未销毁的 Activity public class ActivityStackManager { private Sta ...