我有 Java 应用程序,它集中使用 2D 浮点数组(float[][] 数组),它实际上在黑色背景上保存图像。两个维度都等于(正方形)并且是 2 的幂(大多数是 256、512、1024),因此在大多数情况下,靠近边界的区域为零。
大小等于 2 的幂是为了提高性能(有一些 FFT)并降低对这些阵列的操作(如旋转等)的复杂性。最近,我在 6Gb 的机器上遇到了这个应用程序的堆不足问题。根据我的计算 - 此应用程序的内存消耗应该高达 2-3Gb,而它达到 4-5Gb(在 Windows 任务管理器中查看)。我使用了“YourKit”分析器,它表明这些浮点数组确实占用了大部分内存,但是,这些浮点数组的总粗略大小应该是 1.3Gb(嗯,我知道由 JVM 来决定如何存储数据,但是我没想到内存消耗会相差 2-3 倍)。
我试图使用 Snappy 压缩器即时压缩/解压缩数据(内存消耗下降到 3.5Gb),但性能下降了好几次,这不是很可接受。另外,我在用 BufferedImage 替换那些 floats[][] 时测试了性能,但性能很差。
所以,剩下的 2 种方法对我来说可以减少内存消耗:1)为 float[][] 数组编写包装器以保存“零”元素(有很多“空”行和列)2 ) 远离“2 的幂”
这两种方式都需要大量的编码/重构,所以当我在想“成为或不成为”的时候——也许你对这个问题有更好的线索,伙计们?
谢谢!