当前位置: 技术问答>linux和unix
多文件读写问题,速度边慢
来源: 互联网 发布时间:2015-10-16
本文导语: 写了个多进程程序,每一进程读一个文件同时生成很多文件.1个1g的文件只需要57秒,但是100个10兆文件同时读写,却用了259秒。当然1g文件产生需要写文件远远少于100个10兆所产生的写文件。经过测试发觉瓶颈在io读写90%...
写了个多进程程序,每一进程读一个文件同时生成很多文件.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。怎样才能降低速度,改成多线程?或者其他方法?
谢谢。
有同事建议读文件到内存,一次读入500k,写文件的时候先写入内存10k,然后再写入文件。改写程序后发觉io占用确实降低60%左右。但速度依然没有提高,反而比原来降低。一次读入改成1兆,写文件时改成100k,速度有提高,但依然低于原来直接读写的速度。
我有几个问题:
1。读写入内存减少io操作是否比直接io速度更快?程序中读入写内存我只是简单的使用memcpy,read等命令,其中多次使用new delete 数组。这样是否会明显降低速度
2。怎样才能降低速度,改成多线程?或者其他方法?
谢谢。
|
楼主,硬盘明显属于串行设备,并行能力较差,同时读得多个文件理论上就比在高速流状态下处理单个文件要差,原因在于,磁头在读多个文件的时候会产生过于频繁的物理移动,而单个文件确可以节省这个时间,所以能达到最大读写速率。
前面提到的缓存方式对你这样的应用用处也不大,因为连续大量的读写脏数据根本就谈不上什么缓存效率。
如果要提高一些读写效率,也许只有物理上采用多硬盘系统,但仍然还是采用大批量,小并行的方式处理效率更佳。
对多线程或多进程我觉得不必追求数量,一般多线程多进程主要一是因为有很多个任务需要同时进行,串行方式会造成最长响应时间过长,二是有些任务没有完全利用CPU资源,显得浪费。对你这个系统,我觉得CPU资源在多进程下也许利用率因为进程切换的消耗还不如单进程效率高,如果是为了多个文件能取得平均的响应时间,那别无它法,瓶劲应当在硬盘这里。
最后一个可能提高系统效能的方式就是,如果你的多个文件在接收的时候可以进行预处理,那一个方法就是,接管部分硬盘管理的工作,将多个文件分组群集成一个文件,这样,当你读入一块时,里面就已经包含了多个文件的数据,再分发给各个进程进行处理,这样进程并行又不干扰硬盘的串行读写。这是我能想到的最好的并行方法了。
前面提到的缓存方式对你这样的应用用处也不大,因为连续大量的读写脏数据根本就谈不上什么缓存效率。
如果要提高一些读写效率,也许只有物理上采用多硬盘系统,但仍然还是采用大批量,小并行的方式处理效率更佳。
对多线程或多进程我觉得不必追求数量,一般多线程多进程主要一是因为有很多个任务需要同时进行,串行方式会造成最长响应时间过长,二是有些任务没有完全利用CPU资源,显得浪费。对你这个系统,我觉得CPU资源在多进程下也许利用率因为进程切换的消耗还不如单进程效率高,如果是为了多个文件能取得平均的响应时间,那别无它法,瓶劲应当在硬盘这里。
最后一个可能提高系统效能的方式就是,如果你的多个文件在接收的时候可以进行预处理,那一个方法就是,接管部分硬盘管理的工作,将多个文件分组群集成一个文件,这样,当你读入一块时,里面就已经包含了多个文件的数据,再分发给各个进程进行处理,这样进程并行又不干扰硬盘的串行读写。这是我能想到的最好的并行方法了。