快速读写磁盘数据的方法:

1.块读取:一下子将数据读取到内存的(无论是文本还是二进制),而不是一行行的读取。

2.异步的IO,创建多线程,或者使用重叠IO,IO复用,异步的事件回调通知机制(可以用事件对象,信号驱动来实现)。

3.优化分析文件的算法和尽量延后分析,分析算法里面频繁的申请字符串内存和释放字符串内存,尽量用指针解析出来,分析文件的内容可以延期到使用的时候才分析。

如果不注意,不小心 ,读取文件的主要性能消耗将会在这里,所以需要特别高的重视。

4.使用内存文件映射, window是CreateFileMapping,MapViewOfFile,UnmapViewOfFile,CloseHandle;linux是用mmap,munmap,msync,free。

内存文件映射的使用:

(1)大数据量文件的读取,有效的提高磁盘和内存间数据通信的性能;

(2)进程间快速的共享内存,实现进程间高效的通信。

内存映射文件性能高于普通IO的原因:

内存文件映射和普通的文件IO都是要通过文件系统和硬盘驱动拷贝数据到内存中,内存文件映射数据越大越快主要是:

(1)实际拷贝数据前,需要建立映射信息,内存文件映射已经提前准备好了映射关系,内核调度好了进程内的内存块,交付给内核进行了预先处理,内存文件映射会消耗掉一些时间。

(2)实际拷贝时候,内存文件映射将磁盘数据直接拷贝到用户进程内存空间只进行了一次拷贝,而普通的IO是先将文件拷贝到内核缓存空间,然后才拷贝到用户进程内存空间,进行了两次拷贝。

下面是一个使用普通的fread函数和内存映射文件函数,读取不同大小的磁盘文件的性能分析表:

综合:当读写磁盘文件的数据较小(少于1MB)时候,使用内存文件映射和普通IO是差异很小的,所以建议使用普通IO就可以了;当很多文件的大小在几十MB, 几百MB, 或者1GB以上的文件数据需要进行较频繁的访问,或者一开始需要全部加载这些大文件的时候,那么就需要考虑使用内存文件映射了。

C/C++快速读写磁盘数据的方法-块读取/异步/优化分析算法/内存文件映射的原理和使用相关推荐

  1. [Oracle]快速构造大量数据的方法

    [Oracle]快速构造大量数据的方法: create table tab001(id integer primary key, val varchar2(100)); insert into tab ...

  2. 快速释放磁盘空间的方法

    快速释放磁盘空间的方法:先清空文件,再删除 一.cat /dev/null >文件 二.rm -f 文件 三.命令解释: 1.cat /dev/null > :清空某个已经存在的文件,该命 ...

  3. (六)大白话MySQL是如何基于冷热数据分离的方案,来优化LRU算法?

    (一)大白话MySQL执行SQL的流程 (二)大白话InnoDB存储引擎的架构设计 (三)大白话MySQL Binlog是什么? (四)MySQL的Buffer Pool内存结构 (五)MySQL的B ...

  4. easyexcel导入时读不到数据_EasyExcel快速读写Excel数据

    Java解析.生成Excel比较有名的框架有Apache poi.jxl.但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有 ...

  5. python如何将数据写入nc_读写nc数据的方法(转载)

    本帖最后由 po_po1 于 2014-4-27 20:13 编辑 NetCDFFile.dimensions返回{dimName:size,-}维数与大小的字典.通过获得维数的python字典类型中 ...

  6. html5 二进制数据解析,JavaScript读写二进制数据的方法详解

    前言 二进制是计算技术中广泛采用的一种数制.二进制数据是用0和1两个数码来表示的数,如果想要在前端中处理音频和视频.那你必须要对二进制数据有很好地掌握和操作能力.下面话不多说了,来一起看看详细介绍的吧 ...

  7. 换手机之数据转移方法大全(如何找回手机删除的文件)

    虽然iPhone越来越渣了,但是小编身边的朋友们依然想要换成iPhone手机. 今天就跟大家伙儿说说数据迁移这件小事儿.(苹果.安卓都有) 一.苹果篇 如果之前已经是用苹果手机的朋友,那么进行手机数据 ...

  8. Java JVM 动态方法调用指令 invokedynamic 实现分析(以 Lambda 表达式实现原理为例)...

    一.前言 对于 invokedynamic 指令的实现需要方法句柄作为前提知识点.可参考 Java JVM 动态方法调用之方法句柄 MethodHandle. 本文以 Lambda 表达式中运用 in ...

  9. python处理地震sac数据_试用python读取地震波形的二进制SAC文件

    sac文件比较简单,不过有些设置没有处理,只是单纯的读取并绘图. 代码: import struct import pylab class sacfile_wave: def read(self,sF ...

最新文章

  1. 结构型模式/设计模式
  2. Android开发之第三方推送JPush极光推送知识点详解 学会集成第三方SDK推送
  3. Android底层隐私数据,Android Intent传递数据底层分析详细介绍_Android_脚本之家
  4. 一切都是关于“ –ilities”的
  5. EasyExcel入门使用
  6. linux释放cache
  7. c++笔记(8) 指针及动态内存管理
  8. 【袋鼠云内推】杭州-高级java开发-3~5以及5年以上
  9. 虎牙服务器升级维护中 请留意公告,魔渊之刃像素危城系列活动上线-更新公告1月21日...
  10. 使用GCJ编译Java程序供Matlab调用Java对象方法实践
  11. 「天才学霸」藏在美团
  12. eel库实现JS调用python方法
  13. Android-PickerView系列之源码解析篇(二)
  14. DataFrame 数据筛选
  15. 《程序员》1月精彩内容:区块链技术与应用探索
  16. 时间序列模型(ARIMA和ARMA)完整步骤详述
  17. 简单获取易贝/EBAY的商品详情
  18. postgresql查看密码
  19. 绝代芳华!AI复原90年前梅兰芳:眉目传情,栩栩如生
  20. 初遇初识初知接下来是什么_初识爱|《傲慢与偏见》书评

热门文章

  1. what is the thing you fear most?
  2. LUA table.sort的问题,数组与表的区别
  3. RHEL4下 squid-2.7.STABLE9安装配置
  4. jQuery-强大的jQuery选择器 (详解)
  5. Spotify开源其Cassandra编排工具cstar
  6. PhpStorm快捷键
  7. $sanitize和$sce服务的使用方法
  8. 通过实例代码理解WPF的Dispatcher
  9. Hibernate 中集合对象的抓取策略(Fetching strategies)
  10. 《Head First Python》第一章