zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    withDefaultPasswordEncoder() 过时弃用问题
    @Value不能给静态变量直接赋值问题
    java编程思想之垃圾收集
    阅读java编程思想之一切都是对象
    阅读java编程思想的总结(一)
    Idea连接服务器docker并部署代码到docker实现一键启动
    后端设置Cookie前端跨域获取丢失问题(基于springboot实现)
    win10安装docker并结合Idea2018.1部署springboot项目
    Idea用maven给springboot打jar包
    css纯数字或字母换行
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3157596.html
Copyright © 2011-2022 走看看