C ++中没有足够的内存:写入文件,需要时读取数据?

我正在C ++的Linux机器上开发小波图像分析和机器学习工具。 它受到图像大小,N个方向上每个方向的尺度数量和相应的滤波器(高达2048×2048个双精度)以及机器学习algorithm的额外存储器和处理开销的限制。

不幸的是,我的Linux系统编程技能最好是浅的,所以我目前没有使用交换,但是应该有可能吗?

我需要保留每个尺度和方向的滤波图像的虚部和实部,以及用于重build目的的相应小波。 我把它们留在记忆中,以便为小图像增加速度。

关于内存使用:我已经

  • 存储一切不超过一次,
  • 只有需要什么,
  • 删除任何双重条目或冗余,
  • 仅供参考,
  • 使用临时对象的指针,
  • 一旦不再需要,可以自由记忆
  • 将计算次数限制为绝对最小值。

与大多数数据处理工具一样,速度是至关重要的。 只要有足够的内存,与Matlab代码中的相同实现相比,该工具的速度约快3倍。

但是一旦我没有了记忆就没有任何进展了。 不幸的是,我正在训练algorithm的大多数图像都是巨大的(原始数据4096×4096双input,在对称填充更大之后),因此我经常碰到上限。

暂时将当前计算/处理步骤中不需要的数据从内存写入磁盘是不好的做法?

  • 什么方法/数据格式最适合这样做?
  • 我正在考虑使用rapidXML来读取和写入一个二进制文件的XML,然后只读出所需的数据。 这会工作吗?
  • 内存映射文件是我需要的吗? https://en.wikipedia.org/wiki/Memory-mapped_file

我知道这会导致性能下降,但软件运行顺利并不会冻结更为重要。

我知道在那里有可以做小波图像分析的库,所以请把“为什么重新发明轮子,只是用XYZ”。 我正在使用非常特定的小波,我需要自己做,我不应该使用外部库。

是的,将数据写入磁盘以节省内存是不好的做法。

通常不需要手动将数据写入磁盘以节省内存,除非您达到您可以解决的限制(32位计算机上的4GB,64位计算机上的更多)。

原因是操作系统已经在做完全一样的事情。 你自己的解决方案很可能比操作系统要慢。 如果您不熟悉分页和虚拟内存的概念,请阅读本维基百科的文章 。

你有没有考虑使用mmap和munmap将图像(和临时结果)带入你的地址空间,并在你不再需要的时候丢弃它们。 mmap允许您直接在内存中映射文件的内容。 没有更多的fread / fwrite。 直接内存访问。 写入内存区域也被写回文件,稍后恢复该中间状态不会比重新生成mmap更难。

最大的好处是:

  1. 没有像XML这样的臃肿格式的编码
  2. 非常适合瞬态结果,如在连续存储区域中表示的矩阵。
  3. 死简单的执行。
  4. 完全委托OS决定何时进出。

这并不能解决你的根本问题,但是:你确定你需要以双精度来做所有事情吗? 您可能无法使用整数系数小波,但将图像数据本身存储在双精度中通常相当浪费。 此外,4K图像不是很大…我假设你实际上使用某种类型的帧,所以有多余的条目,否则你的数字似乎并没有加起来(你是否存储稀疏?)。 。也许你只是一次使用一个大数字。

至于“我应该写入磁盘”? 这可以帮助,特别是如果您通过以双精度获取图像数据而增加4倍(或更多)。 你可以自己回答,只需要测量加载的时间,并与你的计算时间进行比较,看看这是否值得追求。 小波本身应该很便宜,所以我猜你大部分是由你的学习算法主导。 在这种情况下,请继续扔掉原始数据或任何东西,直到您再次需要它。