Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:通过二维浮点(float[][])数组减少内存消耗_Java_Arrays_Out Of Memory_Fft_Memory Optimization - Fatal编程技术网

Java:通过二维浮点(float[][])数组减少内存消耗

Java:通过二维浮点(float[][])数组减少内存消耗,java,arrays,out-of-memory,fft,memory-optimization,Java,Arrays,Out Of Memory,Fft,Memory Optimization,我有一个Java应用程序,它集中处理2D浮点数组(float[][]数组),实际上它在黑色背景上保存图像。这两个维度都是相等的(平方)和2的幂(大多数是256、512、1024),所以在大多数情况下靠近边界的区域都是零 为提高性能(有一些FFT)和降低旋转等阵列操作的复杂性,使大小等于2的幂。 最近我在6Gb的机器上遇到了这个应用程序堆不足的问题。 根据我的计算-这个应用程序的内存消耗应该高达2-3Gb,而它达到了4-5Gb(在Windows任务管理器中查找)。 我使用了“YourKit”探查器

我有一个Java应用程序,它集中处理2D浮点数组(float[][]数组),实际上它在黑色背景上保存图像。这两个维度都是相等的(平方)和2的幂(大多数是256、512、1024),所以在大多数情况下靠近边界的区域都是零

为提高性能(有一些FFT)和降低旋转等阵列操作的复杂性,使大小等于2的幂。 最近我在6Gb的机器上遇到了这个应用程序堆不足的问题。 根据我的计算-这个应用程序的内存消耗应该高达2-3Gb,而它达到了4-5Gb(在Windows任务管理器中查找)。 我使用了“YourKit”探查器,它显示这些浮点数组确实占用了大部分内存,但是,这些浮点数组的总大致大小应该是1.3Gb(我知道,如何存储数据取决于JVM,但我不希望内存消耗有2-3倍的差异)

我试图用Snappy compressor动态压缩/解压缩数据(内存消耗下降到3.5Gb),但性能下降了好几次,这是不太可接受的。 另外,我在用BuffereImage替换这些浮动[][]时测试了性能,但性能非常差

因此,还有两种方法可以帮助我减少内存消耗: 1) 为float[][]数组编写包装器,以便保存“零”元素(有许多“空”行和列) 2) 远离“2的力量”

这两种方法都需要大量的编码/重构,所以当我在想“生存还是毁灭”的时候,你们对这个问题有更好的线索吗,伙计们


谢谢

FFT需要一个复杂的数组,它的大小是实际数据数组的两倍,即使您在输入端从实际数组转换到最后的幅度数组。这可能是比预期内存使用量大2倍的原因

稀疏阵列不适用于FFT,因为FFT中的中间步骤几乎总是填充整个复杂阵列


许多现代高性能FFT库,例如基于FFTW的库,可以非常有效地处理FFT长度,而不仅仅是2的幂(任何长度,只要是小素数的乘积,都可以非常有效地进行FFT)。这可以为许多尺寸节省大量2D填充。

经过更详细的调查,JVM启动时似乎带有“UnlockPerimentalFeatures”和“use GC1”标志。因此,存在大量未垃圾收集的“不可访问”BuffereImage光栅(包含byte[]数组)。当从“YourKit”priofiler调用GC时——从堆中移除的对象(这对我来说当然是不可接受的方式,因为我希望JVM能够自己管理堆)

我要感谢所有花时间帮助我的人。
特别感谢吉姆·加里森(看起来我只是将内存需求推迟了一段时间,删除了上面提到的标志,但是当更多的数组出现时-购买更多内存将是避免性能损失的最简单的方法。

浮点型代表什么?例如,为什么你不能将它们改为
int
型呢?我会更仔细地关注它们的性能。)w正在使用数组,以及是否引入了临时数组,这将显著提高内存使用率。您可能还需要研究一些稀疏数组的Java类。@Arsen如何将RGB图像存储在浮点[][],我忍不住相信你有一个彩色通道的第三维。向我们展示这样一个数组的实际声明,并评论像素是如何存储在其中的。@Arsen那么你的数组是三维的?这很容易解释意外的内存消耗(java多维数组被实现为数组数组)。因为每个数组都有一些开销(大约12字节),这对于最内部的浮点[3]相当于存储在所消耗内存中的浮点数的内存量。这就是您的代码示例所建议的。我特别询问了这样一个数组的实际声明,因为这将清楚地说明您真正使用的内存布局。玩猜谜游戏对任何人都没有帮助。请使用所有相关信息更新您的问题details@Arsenhotlicks和我在解释中遇到的问题是:您显示的代码创建了一个每像素3个浮点的数组。您告诉我们该数组是通过(x,y)进行二维索引的.这根本不合适,同意吗?然后你说每像素一个浮点,在这种情况下它就没有意义了,因为精度问题已经被指出。然后你说你需要一个浮点用于FFT,但是一个将R、G和B放在一起的浮点很难适合FFT处理(精度问题除外)因为在进行处理之前,您无论如何都需要分割颜色通道。在进行FFT(使用JTransfrom,也尝试Cuda)之前,请尽量减少混淆/混淆。我正在将float[][]数组转换为Re和Im值(因此,总数组长度增加了两倍),但这只做了一次,在计算相关性之后,我得到了绝对值,数组恢复到正常大小。GC应该收集这些Re-Im数组,我在任何地方都没有链接。关于FFT-libs的好处,请记住