我需要读一个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);
文件映射并不能直接提高速度(前提是读取函数同类比较:C库文件IO、其他语言库文件IO、操作系统API,跨库的话略有差异),只是给多进程之间数据共享提供了高速方式,只访问一份数据即可,没有拷贝赋值的开销。######请问如何才能提高文件的读取速度######
一般来说,操作系统内核API > 操作系统封装API > C库文件IO >其他封装语言库文件IO。 ---不是普遍真理。
具体的你可以换换文件读取接口测试出来。
######没有其他好的方案吗?我们行业专业的软件从60G数据中提取600M数据只需要30s,而我们需要一个多小时,不知道怎么实现######可以考虑看看Sysem Call直接与底层交互访问IOmemset fseek fread 恐怕真没有内存映射快!涉及到页面缓存、进程堆栈数据交换,你需要尽量采用内核API,绕开中间驱动层直接和磁盘IO打交道。
不过,题外话,现在通过纯软件方式提高速度已经很少很少了,都是直接换硬盘、提带宽的,那个效果显著!你可以跟你老板谈谈硬件升级方案或者改改需求了:-)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。