首页 > 解决方案 > 为什么多线程不能改进 mmap 任务?

问题描述

我有一个大任务,需要读取 500 个文件(总共 50G)。

对于每个文件,我都应该将其读出,并根据文件中的数据进行一些计算。只是计算,没有别的。而且我可以确保任务是独立的,只需共享一些要读取的符号对象(我认为这不会是问题)。

目前,我使用 mmap 来获取文件内容的起始指针,并循环计算。

在单线程中,我运行任务,花费 30 秒,

我在线程池中运行它,花了我 35 秒(6 线程)。

我的机器是16G内存,2.2G hz cpu,8线程。

我尝试了很多设置,并仔细确保任务的独立性。

我不太擅长硬件,关于 IO 是否有硬性限制,限制了我的速度?谁能提醒我有什么我可以读的吗?

对不起,代码太复杂了,我不能在这里做一个有效的演示。

标签: c++multithreadingiommap

解决方案


如果要加载整个文件或使用 madvise,可以尝试使用 mmap 上的 MAP_POPULATE 标志进行预读。

这里没有提到最重要的硬件细节,如果您从 SSD 或 HDD 读取,但我假设您使用 SSD,否则线程池代码会慢得多。

我不明白你为什么在这里使用映射。mmap 文件只有三个正当理由,首先,磁盘上的数据结构很复杂,而且您喜欢四处寻找,这很慢,因为它使预读效率大大降低。您需要在进程之间共享内存。或者,当您的系统受到内存压力时,您处理大型文件并且需要操作系统功能将数据交换到文件中(所有数据库都只是出于这个单一原因)。


推荐阅读