多文件读写问题,速度边慢

yikun 2005-08-16 09:21:14
写了个多进程程序,每一进程读一个文件同时生成很多文件.1个1g的文件只需要57秒,但是100个10兆文件同时读写,却用了259秒。当然1g文件产生需要写文件远远少于100个10兆所产生的写文件。经过测试发觉瓶颈在io读写90%,主要是100个文件读取一个文件之后会生成很多个文件,不停的写。
有同事建议读文件到内存,一次读入500k,写文件的时候先写入内存10k,然后再写入文件。改写程序后发觉io占用确实降低60%左右。但速度依然没有提高,反而比原来降低。一次读入改成1兆,写文件时改成100k,速度有提高,但依然低于原来直接读写的速度。
我有几个问题:
1。读写入内存减少io操作是否比直接io速度更快?程序中读入写内存我只是简单的使用memcpy,read等命令,其中多次使用new delete 数组。这样是否会明显降低速度
2。怎样才能降低速度,改成多线程?或者其他方法?

谢谢。
...全文
668 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
yikun 2005-08-30
  • 打赏
  • 举报
回复
通过打印文件名检测,发现多进程在几个地方会等待很久。
1删除文件,这是最久最多的地方,我把他去掉后 速度大为提高。
2写文件的时候。
3open的时候。2,3点都是没法解决的

总结经验:
1文件一直打开不断写入执行的速度并不比打开一次写一次关闭一次速度要快。为什么呢?
2先写内存在写硬盘 也不见速度增加多少。
3动态内存new 与静态内存 在这种境况下 也看不出速度区别。
wjlsmail 2005-08-22
  • 打赏
  • 举报
回复
FAQ 上的:

1. 每次读写 512B 的整数倍,以为硬盘每块512B,这样读写效率高;
2. 用大的文件缓存来减少用户态与核心态交互的次数,提高效率
ghtsao 2005-08-21
  • 打赏
  • 举报
回复
不是读写方法的问题,硬盘有所谓电梯算法的问题,如果文件很分散就象在不同楼层接人,方向也不确定一样,效率就低,但如果一次在一层就装满,不用停多层,速度就快了,大文件通常分连续存放所以磁头扫一次就取了很多数据,写也一样,但如果一会读,一会写并且分了很多次进行,效率可能会降至1/5以下,用GHOST你就知道,如果连续读写的话现在的硬盘速度可以到达上百BPS,但选择性的复制结果如果,很慢。
ghtsao 2005-08-21
  • 打赏
  • 举报
回复
mmap
yikun 2005-08-21
  • 打赏
  • 举报
回复
采用内存影射文件 在linux下如何操作?谢谢
yikun 2005-08-19
  • 打赏
  • 举报
回复
最快的拷贝文件的方法是什么.
1fseek 取的文件长度.
2fread
3fwrite
这样最快?
ghtsao 2005-08-18
  • 打赏
  • 举报
回复
虚拟硬盘的方式是可行的,内存是纯的直接寻址,效率当然比硬盘强多了,反正硬盘只适合连续大批量读写,随机读写性能直线下降。
fytzzh 2005-08-18
  • 打赏
  • 举报
回复
new delete 很浪费时间。
尽量减少分配内存的操作。
可以先new出比较大的空间(可以测试多大比较合适),每次从文件读出一定数量写入内存,将内存中的数据一次写入文件。
如果用过MFC的话,类似内存文件。这样减少分配内存的时间。写文件次数也比较少。
yikun 2005-08-17
  • 打赏
  • 举报
回复
我的测试机器是双cpu3.0 内存储器2g.我将1g内存作为虚拟硬盘 RamDisk.1g的虚拟硬盘只包括产生的写文件 不包括100个10兆的读文件。速度很快就上去 因为是纯内存的操作,100个10兆只需要84秒。1g的虚拟硬盘始终不够大,到一定程度 他自己把文件从内存转移到硬盘。
我的想法是 每当一个子进程完成后 就把该子进程产生的目录文件 整个转移到 外面的硬盘,这样不断的虚拟硬盘。不知道是否可行?
ghtsao 2005-08-16
  • 打赏
  • 举报
回复
楼主,硬盘明显属于串行设备,并行能力较差,同时读得多个文件理论上就比在高速流状态下处理单个文件要差,原因在于,磁头在读多个文件的时候会产生过于频繁的物理移动,而单个文件确可以节省这个时间,所以能达到最大读写速率。

前面提到的缓存方式对你这样的应用用处也不大,因为连续大量的读写脏数据根本就谈不上什么缓存效率。

如果要提高一些读写效率,也许只有物理上采用多硬盘系统,但仍然还是采用大批量,小并行的方式处理效率更佳。

对多线程或多进程我觉得不必追求数量,一般多线程多进程主要一是因为有很多个任务需要同时进行,串行方式会造成最长响应时间过长,二是有些任务没有完全利用CPU资源,显得浪费。对你这个系统,我觉得CPU资源在多进程下也许利用率因为进程切换的消耗还不如单进程效率高,如果是为了多个文件能取得平均的响应时间,那别无它法,瓶劲应当在硬盘这里。

最后一个可能提高系统效能的方式就是,如果你的多个文件在接收的时候可以进行预处理,那一个方法就是,接管部分硬盘管理的工作,将多个文件分组群集成一个文件,这样,当你读入一块时,里面就已经包含了多个文件的数据,再分发给各个进程进行处理,这样进程并行又不干扰硬盘的串行读写。这是我能想到的最好的并行方法了。
AlphaCN_NET 2005-08-16
  • 打赏
  • 举报
回复
换个文件系统,并且采取多目录结构
yjf7888 2005-08-16
  • 打赏
  • 举报
回复
用带缓冲的文件IO试试,fopen,fread,fwrite

23,110

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧