c++:如何优化IO?

标签 c++ optimization io

我正在研究一个数学问题,它的优势是能够“预先计算”大约一半的问题,将此信息保存到文件中,然后多次重复使用它来计算我的问题的各种“实例” .困难在于上传所有这些信息以解决实际问题是一个主要瓶颈。

更具体地说: 我可以预先计算大量信息 - 大量的概率 (long double),大量的 std::map<int,int> ,等等 - 并将所有这些内容保存到磁盘(几个 Gb)。

我的程序的后半部分接受一个输入参数D。对于每个 D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和其他一些特定于 D 的数据的组合(这样每个D的问题都不同)。

有时我需要从文件中挑选出某些预先计算的信息。其他时候,我需要上传(大)文件中的每条数据。

有什么策略可以让 IO 更快?

由于其他原因,我已经将程序并行化(MPI,通过 boost::mpi),但无论如何,访问磁盘上的文件会让我的计算时间难以忍受。

有什么策略或优化吗?

目前我正在使用 cstdio 做所有事情,即没有 iostream .这会有很大的不同吗?

最佳答案

当然,最快(但最脆弱)的解决方案是将数据 mmap 到固定地址。将其全部放入一个大的 struct 中,并使用分配器实例化 std:::map,该分配器将分配到附加到结构末尾的 block 中。这并不简单,但会很快;一次调用mmap,数据就在你的(虚拟)内存中。而且因为你在 mmap 中强制地址,你甚至可以存储指针等。

如上所述,除了需要大量工作之外,它还很脆弱。重新编译你的应用程序,目标地址可能不可用,或者布局可能不同,或者其他什么。但由于它实际上只是一种优化,所以这可能不是问题;每当出现兼容性问题时,只需删除旧文件并重新开始。它会在破坏兼容性的更改后进行第一次运行,速度非常慢,但如果你不经常破坏兼容性......

关于c++:如何优化IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10030505/

相关文章:

c++ - Qt websocket 在进入下一个方法之前发送消息并等待响应

java - 如何在java中检查解析数据的语言

python - 如何调整系统参数以使 numpy 的 load() 和 save() 实现 AWS HDD 卷的最大带宽?

go - io.copyN 不是第一次调用时不能工作

c++ - 从 mmap() 读取时 ntohl() 返回 0

c++ - 在 HTTP 中获取空响应在 QT QNetworkAccessManager 中获取请求

php - 可以帮助 Web 开发人员节省时间的实用编码技巧吗?

optimization - 在 Copy 类型中使用 std::ptr::write_volatile 实现内部可变性的安全性(即没有 UnsafeCell)

c# - 如何获得特定长度的最大数量

c++ - Qt 中许多 Windows 函数的未解决链接器错误