• 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

  • 相关阅读:
    算法(第4版)-1.4.8 处理对于输入的依赖
    设计模式学习笔记之练习代码
    常用算法Java实现之快速排序
    常用算法Java实现之希尔排序
    常用算法Java实现之直接插入排序
    常用算法Java实现之选择排序
    常用算法Java实现之冒泡排序
    Java 集合框架之 Map
    Java 集合框架之Collection
    HBase 参考文档翻译之 Getting Started
  • 原文地址:https://www.cnblogs.com/TenosDoIt/p/3157596.html
Copyright © 2020-2023  润新知