关于内存映射的基本知识以及一些函数的原型说明,参考博客: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. int main()
  9. {
  10. clock_t start, finish;
  11. //------------------------------------------------------内存映射方法;
  12. start = clock();
  13. //创建或打开文件内核对象;
  14. HANDLE fileH = CreateFile("ldFeature.txt",
  15. GENERIC_READ|GENERIC_WRITE,
  16. FILE_SHARE_READ,
  17. NULL,
  18. OPEN_EXISTING,
  19. FILE_ATTRIBUTE_NORMAL,
  20. NULL);
  21. if(fileH == INVALID_HANDLE_VALUE)
  22. {
  23. cout<<"error in CreateFile"<<endl;
  24. return -;
  25. }
  26.  
  27. //创建一个文件映射内核对象;
  28. HANDLE mapFileH = CreateFileMapping( fileH,
  29. NULL,
  30. PAGE_READWRITE,
  31. ,
  32. ,
  33. "Resource " );
  34. if(mapFileH == NULL)
  35. {
  36. cout<<"error in CreateFileMapping"<<endl;
  37. return -;
  38. }
  39.  
  40. //将文件数据映射到进程的地址空间;
  41. char * mapH = (char *)MapViewOfFile( mapFileH,
  42. FILE_MAP_ALL_ACCESS,
  43. ,
  44. ,
  45. );
  46. if(mapH == NULL)
  47. {
  48. cout<<"error in MapViewOfFile"<<endl;
  49. return -;
  50. }
  51.  
  52. //读取数据;
  53. char *buf = mapH;
  54. double k;
  55. int times = *;
  56. for(int i = ; i <= times; i++)
  57. {
  58. k = atof(buf);
  59. buf = strstr(buf+," ");
  60. //cout<<k<<endl;
  61. }
  62. //关闭句柄;
  63. UnmapViewOfFile(mapH);
  64. CloseHandle(mapFileH);
  65. CloseHandle(fileH);
  66.  
  67. finish = clock();
  68. //打印耗时;
  69. cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl;
  70.  
  71. //------------------------------------------------------传统方法;
  72. start = clock();
  73.  
  74. FILE *fp = fopen("ldFeature.txt","r");
  75. if(fp == NULL)
  76. {
  77. cout<<"error in fopen"<<endl;
  78. return -;
  79. }
  80. for(int i = ;i <= times; i++)
  81. {
  82. fscanf(fp,"%lf",&k);
  83. }
  84. fclose(fp);
  85.  
  86. finish = clock();
  87. cout<<"time:"<<(double)(finish - start)/ CLOCKS_PER_SEC<<endl;
  88.  
  89. return ;
  90. }

结果显示,传统方法耗时是内存映射方法的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. iOS6新特征:UICollectionView介绍-非常棒 -转

    传送门:http://www.devdiv.com/forum.php?mod=viewthread&tid=128378

  2. ASP.NET MVC:如何提供 Controller 继承体系使用的 ModelBinder?

    背景 Mvc 提供了一种可扩展的模型绑定机制,具体来说就是:将客户端传递的参数按照一定的策略绑定到 action 的参数上,这带来的直接好处就是让 action 的参数支持强类型.一般来说我们有如下方 ...

  3. python测试开发django-33.admin后台一对一关系OneToOneField

    前言 假如有一张表(Card)记录用户的卡号信息和用户名,现在需要新增一个小功能,记录用户的手机号,邮箱和住址等更多信息. 为了不影响原来的表设计,可以新增一张表(CardDetail),专门记录用户 ...

  4. Android 百度地图开发(三)

    实现比例尺功能和替换自带的缩放组件 ScaleView是比例尺控件.ZoomControlView是缩放控件,MainActivity就是我们的主界面了 先看下ZoomControlView类.代码例 ...

  5. SharePoint Online 创建和使用视图

    前言 本文介绍如何在Office 365中创建和使用视图. 正文 首先,解释一下什么是SharePoint站点视图,所谓视图,就是列表的一个呈现形式,包含特定的栏.排序.筛选.分组等特性,我们通常创建 ...

  6. Javascript与Objective-C 字符串与数组的方法类比

    table {border-collapse:collapse;} table td {border:1px solid #ccc;} String vs NSString JavaScript st ...

  7. 简析Window、Activity、DecorView以及ViewRoot之间的错综关系

    一.职能简介 Activity Activity并不负责视图控制,它只是控制生命周期和处理事件.真正控制视图的是Window.一个Activity包含了一个Window,Window才是真正代表一个窗 ...

  8. java转义符和正则表达式转义符

    举例来说,连续相同的3位数字的正则表达式的标准语法是: ([\d])\1{2} 但是如果在java代码中这么写,就会出现语法错误,如下: String regEx = "([\d])\1{2 ...

  9. 微信二维码扫描无法下载APK文件的解决办法

  10. 洛谷 P1164 小A点菜

    题目背景 uim神犇拿到了uoi的ra(镭牌)后,立刻拉着基友小A到了一家……餐馆,很低端的那种. uim指着墙上的价目表(太低级了没有菜单),说:“随便点”. 题目描述 不过uim由于买了一些辅(e ...