c ++:如何优化IO?

cmo*_*cmo 16 c++ io optimization

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

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

我计划下半年接受输入参数d.对于每个D,我需要执行大量计算,这些计算涉及预先计算的数据(来自文件)和特定于D的一些其他数据的组合(因此每个D的问题都不同).

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

是否有任何使IO更快的策略?

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

任何策略或优化?

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

Jam*_*nze 14

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

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


DRV*_*Vic 6

不在地图中的东西很容易.你把所有内容放在一个你知道的连续内存块中(比如一个大数组,或者一个没有指针的结构/类),然后用write()它来写出来.稍后用于read()在单个操作中读取它.如果大小可能不同,则使用一个操作来读取int具有大小的单个操作,分配内存,然后使用单个read()操作将其拉入.

地图部分有点难,因为你无法在一次操作中完成所有操作.在这里,您需要提出一个序列化的约定.为了使i/o尽可能快,最好的办法是将它从地图转换为内存形式,这些形式都集中在一个地方,您可以轻松快速地转换回地图.例如,如果您的键是整数,并且您的值是常量大小,则可以创建一个键数组和一个值数组,将键复制到一个数组中,将值复制到另一个数组中,然后write()将两个数组复制,也可能写出它们的大小.再一次,你只需要拨打两到三次电话即可阅读read().

请注意,没有任何内容转换为ASCII,并且系统调用次数最少.该文件不是人类可读的,但它将是紧凑的,并且读取速度快.三件事使得i/o变慢:1)系统调用,如果你使用小的读/写; 2)转换为/从ASCII(printf,scanf); 3)磁盘速度.很难做到3)(除了SSD).您可以在后台线程中执行读取操作,但可能需要阻止等待数据进入.

  • @CycoMatto,使用`fwrite`和`fread`来直接写/读二进制数据. (2认同)