我正在开发一种用于C ++中Linux机器上的小波图像分析和机器学习的工具。 它受到图像的大小,比例的数量及其相应的滤波器(最多2048x2048双倍)的限制,以及机器学习算法的额外内存和处理开销。
不幸的是,我的Linux系统编程技巧最多, 所以我目前正在使用没有交换,但认为它应该可能以某种方式?
我需要保留虚构和真实的部分 过滤每个比例和方向的图像,以及用于重建目的的相应小波。我将它们留在记忆中以获得小图像的额外速度。
关于内存使用:我已经
与大多数数据处理工具一样,速度至关重要。只要有 与Matlab代码中的相同实现相比,该工具的内存足够快3倍。
但是一旦我失去记忆就什么都没有了。不幸的是,我正在训练算法的大部分图像都是巨大的(原始数据4096x4096双重条目,在对称填充之后甚至更大),因此我经常达到上限。
暂时将当前计算/处理步骤不需要的数据从内存写入磁盘是不是很糟糕?
我知道这会导致性能下降,但更重要的是软件运行顺畅且不会冻结。
我知道那里有可以进行小波图像分析的库,所以请不要“为什么要重新发明轮子,只需使用XYZ”。我正在使用非常具体的小波,我需要自己做,我不应该使用外部库。
答案 0 :(得分:2)
是的,将数据写入磁盘以节省内存是不好的做法。
通常无需手动将数据写入磁盘以节省内存,除非您达到了可以解决的限制(在32位计算机上为4GB,在64位计算机上更多)。
原因是操作系统已经做了完全相同的事情。您自己的解决方案很可能比操作系统的速度慢。如果您不熟悉分页和虚拟内存的概念,请阅读this Wikipedia article。
答案 1 :(得分:2)
您是否考虑过使用mmap和munmap将图像(和临时结果)带入地址空间,并在不再需要时将其丢弃。 mmap允许您直接在内存中映射文件的内容。没有更多的fread / fwrite。直接内存访问。对内存区域的写入也会写回到文件中,稍后将该中间状态带回来并不比重做mmap更难。
最大的好处是:
答案 2 :(得分:0)
这并不能解决您的根本问题,但是:您确定需要以双精度完成所有工作吗?您可能无法使用整数系数小波,但将图像数据本身存储在双精度中通常会非常浪费。此外,4k图像并不是很大......我假设您实际上正在使用某种类型的帧,因此有多余的条目,否则您的数字似乎不会相加(并且您正在存储)他们稀疏?)......或者你可能只是一次使用大数字。
至于"我应该写入磁盘"?这可以提供帮助,特别是如果通过将图像数据提高到双精度来增加4倍(或更多)。您可以自己回答,只需测量加载时间并与计算时间进行比较,看看是否值得追求。小波本身应该非常便宜,所以我猜你大多数都是以你的学习算法为主。在这种情况下,请继续扔掉原始数据或其他任何内容,直到您再次需要它为止。