免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2136 | 回复: 5
打印 上一主题 下一主题

大家进来讨论一下unix下把文件全部内容加载入内存的办法。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-02-26 21:59 |只看该作者 |倒序浏览
其实,办法还是有很多的,但是哪个高效呢?


1,可以用一个while循环然后用fgets,也可以用C++的getline
2,stat获取文件大小,然后可以用mmap的方式
3,stat获取文件大小,然后利用系统调用read()函数,read是read_n方式读取

现在我用的是read_n方式,一次性读取。个人理解这样的系统调用次数应该是最少的(当然,以一次能顺利读取整个文件大小为前提)。
现在问题来了,简单取一个模型,

1、一个进程要读取25个这样的文件,读取形式很简单,读进内存,然后释放内存。
2、文件有两类,A类文件和B类文件,大小B类文件是A类文件的5倍大小。
3、假设有25*100个A类文件和25*100个B类文件,开100个进程去读,每个进程读25个文件。
4、每个A类文件的大小是500K,每个B类文件的大小是2.5M

如上所说,读文件的方式我使用的是read_n方式。也就是第三种。


问题来了!
读B类文件大小所花的时间,是读A类文件的4倍左右的时间。这是否是因为文件大小影响了时间效率?

论坛徽章:
0
2 [报告]
发表于 2009-02-26 22:17 |只看该作者
对呀,文件大,读起来当然就慢了。文件系统读一个文件的时候也得一块一块的读呀。文件系统追到底下是block device. 以block为单位的操作。

论坛徽章:
0
3 [报告]
发表于 2009-02-26 23:24 |只看该作者

回复 #1 stratovarius 的帖子

嗯。是因为文件大小而影响的速度。
其实使用read_n与mmap的速度差不多的,我以前对大文件测试过。

论坛徽章:
0
4 [报告]
发表于 2009-02-27 09:25 |只看该作者
我想明确一下,这个贴是讨论读取文件全部内容的方式,还是讨论效率最高的读取方式?

论坛徽章:
0
5 [报告]
发表于 2009-02-27 11:54 |只看该作者
原帖由 scutan 于 2009-2-26 23:24 发表
嗯。是因为文件大小而影响的速度。
其实使用read_n与mmap的速度差不多的,我以前对大文件测试过。



其实还是有区别的, 用read_n读大文件, 比如说是500M的,我的测试结果是, 比如说要读1000个这样的500M大小的文件,随着时间运行越来越长, 用mmap的读取时间会出现波动, 而用read_n则很稳定, 基本是在0-2秒内搞定. mmap则会出现0-10秒内的浮动, 我想应该是跟操作系统的映射策略有关, 如lazy loading. 用的是IBM的3850, 4U, 32G RAM, 不过用的是GPFS文件系统,并发数没这么高, 估计最多也是3-5个之间

[ 本帖最后由 stratovarius 于 2009-2-27 11:57 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2009-02-27 11:56 |只看该作者
原帖由 雨过白鹭洲 于 2009-2-27 09:25 发表
我想明确一下,这个贴是讨论读取文件全部内容的方式,还是讨论效率最高的读取方式?



讨论的是读取文件全部内容的方式 并且讨论一下使用哪种方式会让我的测试case的效率比较好.

[ 本帖最后由 stratovarius 于 2009-2-27 11:58 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP