6
回答
文件映射之后能提高文件读取速度嘛?我应用之后没发现提高?
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

我需要读一个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);

<无标签>
举报
do_mybest
发帖于3年前 6回/187阅
共有6个答案 最后回答: 3年前
文件映射并不能直接提高速度(前提是读取函数同类比较:C库文件IO、其他语言库文件IO、操作系统API,跨库的话略有差异),只是给多进程之间数据共享提供了高速方式,只访问一份数据即可,没有拷贝赋值的开销。
--- 共有 1 条评论 ---
do_mybest请问如何才能提高文件的读取速度 3年前 回复

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

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

--- 共有 1 条评论 ---
do_mybest没有其他好的方案吗?我们行业专业的软件从60G数据中提取600M数据只需要30s,而我们需要一个多小时,不知道怎么实现 3年前 回复
提取? 是把文件具体内容按二进制方式复制到你的容器里面吗?文件读取+复制,不同API的组合性能上确实有差异,这个差异也是非常微小的,重复10万次以上可能才会有几十秒的差距,不可能如你所说是30s与一个多小时的差距!一定还有其他操作影响了
你贴代码吧。 同样网络条件、同样硬盘、同样文件大小,30s与1个多小时的差距到底是怎样诞生的呢?各个API参数调整、串行并行、缓存都不至于有如此差距
--- 共有 1 条评论 ---
do_mybestmemset(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); } ​ ​这是我的测试代码,你能想到怎么提高嘛? 3年前 回复

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

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


--- 共有 1 条评论 ---
do_mybest我用内存映射之后速度没有改善啊 3年前 回复
顶部