开发者社区> 问答> 正文

文件映射之后能提高文件读取速度嘛?我应用之后没发现提高?:报错

我需要读一个60G的文件,单只需要读一部分内容,每24244字节读240字节内容,我文件映射之后没有发现和直接文件读取得速度有区别啊?哪位大侠能解释一下?

常规读取方式

fseek(pf,j*(240+6001*4)+3600,0);
fread(pcDataBuf+j*240, 1,240,pf);

文件映射读取方式

vMapAddres为文件映射的首地址

memcpy(pcDataBuf+j*240,vMapAddres[0]+3600+j*(240+6001*4),240);

展开
收起
kun坤 2020-06-07 14:12:37 526 0
1 条回答
写回答
取消 提交回答
  • 文件映射并不能直接提高速度(前提是读取函数同类比较:C库文件IO、其他语言库文件IO、操作系统API,跨库的话略有差异),只是给多进程之间数据共享提供了高速方式,只访问一份数据即可,没有拷贝赋值的开销。######请问如何才能提高文件的读取速度######

    一般来说,操作系统内核API > 操作系统封装API > C库文件IO >其他封装语言库文件IO。   ---不是普遍真理。

    具体的你可以换换文件读取接口测试出来。

    ######没有其他好的方案吗?我们行业专业的软件从60G数据中提取600M数据只需要30s,而我们需要一个多小时,不知道怎么实现######可以考虑看看Sysem Call直接与底层交互访问IO
    ######提取? 是把文件具体内容按二进制方式复制到你的容器里面吗?文件读取+复制,不同API的组合性能上确实有差异,这个差异也是非常微小的,重复10万次以上可能才会有几十秒的差距,不可能如你所说是30s与一个多小时的差距!一定还有其他操作影响了######你贴代码吧。 同样网络条件、同样硬盘、同样文件大小,30s与1个多小时的差距到底是怎样诞生的呢?各个API参数调整、串行并行、缓存都不至于有如此差距######memset(pcDataBuf,0,2734765*204); for(int j = 0; j<27031; j++) { fseek(pf,j*(240+6001*4)+3600,0); fread(pcDataBuf+j*240, 1,240,pf); } ​ ​这是我的测试代码,你能想到怎么提高嘛?######

    memset fseek fread 恐怕真没有内存映射快!涉及到页面缓存、进程堆栈数据交换,你需要尽量采用内核API,绕开中间驱动层直接和磁盘IO打交道。

    不过,题外话,现在通过纯软件方式提高速度已经很少很少了,都是直接换硬盘、提带宽的,那个效果显著!你可以跟你老板谈谈硬件升级方案或者改改需求了:-)


    ######我用内存映射之后速度没有改善啊
    2020-06-07 14:12:41
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载