c++ - 为什么多线程不能改进 mmap 任务?
问题描述
我有一个大任务,需要读取 500 个文件(总共 50G)。
对于每个文件,我都应该将其读出,并根据文件中的数据进行一些计算。只是计算,没有别的。而且我可以确保任务是独立的,只需共享一些要读取的符号对象(我认为这不会是问题)。
目前,我使用 mmap 来获取文件内容的起始指针,并循环计算。
在单线程中,我运行任务,花费 30 秒,
我在线程池中运行它,花了我 35 秒(6 线程)。
我的机器是16G内存,2.2G hz cpu,8线程。
我尝试了很多设置,并仔细确保任务的独立性。
我不太擅长硬件,关于 IO 是否有硬性限制,限制了我的速度?谁能提醒我有什么我可以读的吗?
对不起,代码太复杂了,我不能在这里做一个有效的演示。
解决方案
如果要加载整个文件或使用 madvise,可以尝试使用 mmap 上的 MAP_POPULATE 标志进行预读。
这里没有提到最重要的硬件细节,如果您从 SSD 或 HDD 读取,但我假设您使用 SSD,否则线程池代码会慢得多。
我不明白你为什么在这里使用映射。mmap 文件只有三个正当理由,首先,磁盘上的数据结构很复杂,而且您喜欢四处寻找,这很慢,因为它使预读效率大大降低。您需要在进程之间共享内存。或者,当您的系统受到内存压力时,您处理大型文件并且需要操作系统功能将数据交换到文件中(所有数据库都只是出于这个单一原因)。
推荐阅读
- python - 只有今天的日期 id 应该显示在 django 的列表中
- java - 为 Maven 预集成测试阶段启动多个 Spring Boot 应用程序
- c++ - g++ 和 clang++ 不同的行为与自动参数的模板特化
- docker - 无法更新对象类型 *libnetwork.endpointCnt 的存储:在存储中找不到密钥
- r - 从数据框列表中创建一个输出文件,其中包含每个数据框的特定名称和维度
- react-native - 在本机反应中从数组中查找和替换键
- java - 如何在java中删除日志文件中的日期和时间
- javascript - 基于滚动触发背景图像的更好方法
- java - 如何使用自定义消息记录肥皂请求和响应以在 Spring Boot 中归档?
- r - R:删除具有 2 列中文本条件组合的行