【发布时间】:2015-07-07 16:42:39
【问题描述】:
我正在用 C++ 在 Linux 机器上开发一种用于小波图像分析和机器学习的工具。 它受到图像大小、N 个方向中每个方向的尺度数量及其对应的过滤器(最多 2048x2048 双倍)以及机器学习算法的额外内存和处理开销的限制。
不幸的是,我的 Linux 系统编程技能充其量是肤浅的, 所以我目前没有使用交换,但认为它应该是可能的?
我需要保持虚部和实部 每个尺度和方向的过滤图像,以及用于重建目的的相应小波。我将它们保存在内存中以提高小图像的速度。
关于内存使用:我已经
- 所有内容都存储一次,
- 只有需要的,
- 删除任何重复条目或冗余,
- 仅供参考,
- 在临时对象上使用指针,
- 在不再需要内存时立即释放内存并且
- 将计算次数限制在绝对最小值。
与大多数数据处理工具一样,速度至关重要。只要有 内存是否足够,该工具的速度大约是 Matlab 代码中相同实现的 3 倍。
但是一旦我失去记忆,就什么都没有了。不幸的是,我训练算法的大多数图像都很大(原始数据 4096x4096 双条目,对称填充后更大),因此我经常碰到天花板。
暂时将当前计算/处理步骤不需要的数据从内存写入磁盘会是不好的做法吗?
- 哪种方法/数据格式最适合这样做?
- 我正在考虑使用 rapidXML 读取 XML 并将其写入二进制文件,然后只读取所需的数据。这行得通吗?
- 我需要内存映射文件吗? https://en.wikipedia.org/wiki/Memory-mapped_file
我知道这会导致性能损失,但更重要的是软件运行流畅且不会死机。
我知道有一些库可以进行小波图像分析,所以请不要说“为什么要重新发明轮子,只用 XYZ 代替”。我正在使用非常特定的小波,我需要自己做,我不应该使用外部库。
【问题讨论】:
-
忘记 XML。最适合用作临时存储的数据格式与您在内部使用的数据格式相同——您可以使用
fread和fwrite或您的操作系统平台特定函数存储大量算术类型(包括复数对) (通常允许您提示预读缓存) -
或者使用一些中性的二进制序列化格式,比如 XDR
-
顺便说一句,这通常是让您的软件成为免费软件(并将其发布到例如github.com ...)可以帮助您很大的情况。