多线程访问映射文件效率反而更低?

Icer 2017-10-26 06:43:48
在项目中需要统计超大日志文件的行数(包含一些行日志类型的判断),测试日志文件2.7G左右约2000W行,采用64位程序全部映射到内存,然后分块统计,每16M一块
在第一次运行时,文件并没有被映射到内存页,有一个从硬盘读取文件到内存的过程
单线程统计,测试19秒
四线程统计,测试89秒
八线程统计,测试66秒
即使算上加锁解锁的消耗,效率相差也不应该如此大
希望大神告知,是否文件映射缺页时的内存调度对多线程访问的效率较低?
...全文
481 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2017-10-27
  • 打赏
  • 举报
回复
2.7G 19秒加载 145M/s 文件加快读取,没有特效办法。。除非。ssd快点,然后要么内存条大点,把内存割出来虚拟硬盘,比ssd更快。但怕宕机。
schlafenhamster 2017-10-27
  • 打赏
  • 举报
回复
一个CPU ,多线程 ,只适合各线程有idle时间,如果一个线程都忙不过来,多线程只会更慢。
red-fly 2017-10-27
  • 打赏
  • 举报
回复
这个没有试过,不过读取文件的部分应该还是瓶颈,虽然是映射到内存,但并不代表已经读入,当访问对应位置时,才有可能从磁盘上读取,所以即使线程多,也未必会提高效率。 如果全部读入内存,然后使用不同线程对不同块进行分析,那应该会有效率提升,但仅仅对分析部分有效,读取部分未必有效,如果使用固态硬盘,那就有可能确实会有较大效率的提升,因为一般情况下,都是文件读取的瓶颈导致的
oyljerry 2017-10-27
  • 打赏
  • 举报
回复
最好是一开始就给每个线程分好各自的块,然后就不要有加锁的地方等,各个线程先各自处理,等都处理结束了,再统一合并结果
赵4老师 2017-10-27
  • 打赏
  • 举报
回复
在文件大小相同的前提下: 读刚读过的文件比头次读没读过的文件快 读转速快的硬盘上的文件比读转速慢的硬盘上的文件快 读没有磁盘碎片的文件比读有磁盘碎片的文件快 读文件不处理比边读边处理快 单线程从头到尾一次读文件比多线程分别读文件各部分快(非固态硬盘上) 读固态硬盘上的文件比读普通硬盘上的文件快

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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