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

时间:2015-07-07 16:42:40

标签: c++ linux memory

我正在开发一种用于C ++中Linux机器上的小波图像分析和机器学习的工具。 它受到图像的大小,比例的数量及其相应的滤波器(最多2048x2048双倍)的限制,以及机器学习算法的额外内存和处理开销。

不幸的是,我的Linux系统编程技巧最多, 所以我目前正在使用没有交换,但认为它应该可能以某种方式?

我需要保留虚构和真实的部分 过滤每个比例和方向的图像,以及用于重建目的的相应小波。我将它们留在记忆中以获得小图像的额外速度。

关于内存使用:我已经

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

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

但是一旦我失去记忆就什么都没有了。不幸的是,我正在训练算法的大部分图像都是巨大的(原始数据4096x4096双重条目,在对称填充之后甚至更大),因此我经常达到上限。

暂时将当前计算/处理步骤不需要的数据从内存写入磁盘是不是很糟糕?

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

我知道这会导致性能下降,但更重要的是软件运行顺畅且不会冻结。

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

3 个答案:

答案 0 :(得分:2)

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

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

原因是操作系统已经做了完全相同的事情。您自己的解决方案很可能比操作系统的速度慢。如果您不熟悉分页和虚拟内存的概念,请阅读this Wikipedia article

答案 1 :(得分:2)

您是否考虑过使用mmap和munmap将图像(和临时结果)带入地址空间,并在不再需要时将其丢弃。 mmap允许您直接在内存中映射文件的内容。没有更多的fread / fwrite。直接内存访问。对内存区域的写入也会写回到文件中,稍后将该中间状态带回来并不比重做mmap更难。

最大的好处是:

  1. 没有像XML这样的臃肿格式进行编码
  2. 非常适合瞬态结果,例如在连续内存区域中表示的矩阵。
  3. 简单易于实施。
  4. 完全委托操作系统决定何时进出交换。

答案 2 :(得分:0)

这并不能解决您的根本问题,但是:您确定需要以双精度完成所有工作吗?您可能无法使用整数系数小波,但将图像数据本身存储在双精度中通常会非常浪费。此外,4k图像并不是很大......我假设您实际上正在使用某种类型的帧,因此有多余的条目,否则您的数字似乎不会相加(并且您正在存储)他们稀疏?)......或者你可能只是一次使用大数字。

至于"我应该写入磁盘"?这可以提供帮助,特别是如果通过将图像数据提高到双精度来增加4倍(或更多)。您可以自己回答,只需测量加载时间并与计算时间进行比较,看看是否值得追求。小波本身应该非常便宜,所以我猜你大多数都是以你的学习算法为主。在这种情况下,请继续扔掉原始数据或其他任何内容,直到您再次需要它为止。