我正在研究一个数学问题,它的优势是能够“预先计算”大约一半的问题,将此信息保存到文件中,然后多次重复使用它来计算我的问题的各种“实例” .困难在于上传所有这些信息以解决实际问题是一个主要瓶颈。
更具体地说:
我可以预先计算大量信息 - 大量的概率 (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/