首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java:通过2D float (floats[][])数组减少内存消耗

Java:通过2D float (floats[][])数组减少内存消耗
EN

Stack Overflow用户
提问于 2013-11-08 03:58:35
回答 2查看 382关注 0票数 5

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

为了提高性能(有一些FFT)和降低旋转等操作的复杂性,大小等于2的幂。最近,我在我的6 6Gb机器上遇到了这个应用程序缺乏堆的问题。根据我的计算-这个应用程序的内存消耗应该是2-3 3Gb,而它达到了4-5 3Gb(在Windows任务管理器中查看)。我使用了"YourKit“分析器,它显示那些floats数组确实占用了大部分内存,然而,这些floats数组的总粗略大小应该是1.3 in (嗯,我知道如何存储数据是由JVM决定的,但我并不期望内存消耗会有2-3倍的差异)。

我试图使用Snappy compressor动态压缩/解压缩数据(内存消耗下降到3.5 is ),但性能下降了几倍,这是不太能接受的。此外,我还测试了用BufferedImage替换这些浮点数时的性能,但性能非常差。

所以,对于我来说,有两种方法可以减少内存消耗: 1)写入float数组的包装器,以节省“零”元素(有很多“空”行和列) 2)远离“2的幂”

这两种方式都需要相当多的编码/重构,所以当我在思考“生存还是死亡”时-也许你们在这个问题上有更好的线索,伙计们?

谢谢!

EN

回答 2

Stack Overflow用户

发布于 2013-11-08 05:11:12

FFT需要一个复数组,它的大小是实数据数组的两倍,即使您在输入时从实数组转换回数值数组,也是如此。这可能占比预期大2倍的内存使用量。

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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-09 17:42:32

经过更详细的调查,似乎JVM启动时带有"UnlockEperimentalFeatures“和"use GC1”标志。结果--有相当多的非垃圾回收的“无法到达”的BufferedImage栅格(包含byte[]数组)。当从“JVM”priofiler调用GC时-那些从堆中移除的对象(这对我来说当然不是可接受的方式,因为我期望YourKit会自己管理堆)。

我想说声谢谢每一位花时间帮助我的人。特别感谢Jim Garrison (看起来我只是将内存需求推迟了一段时间,去掉了上面提到的标志,但当更多的数组开始使用时-购买更多的内存将是避免性能损失的最简单的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19845470

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档