我有Java应用程序,它集中处理2D浮动数组(float[][]数组),实际上在黑色背景上保存图像。两个维度是相等的(平方)并且是2的幂(通常是256、512、1024),所以靠近边界的区域在大多数情况下都是零。
为了提高性能(有一些FFT)和降低在这些阵列上操作的复杂性(如旋转等),大小等于2的幂。根据我的计算,这个应用程序的内存消耗应该达到2-3Gb,而达到4-5Gb(查看Windows任务管理器)。我使用了“YourKit”探查器,它显示这些浮点数组确实占用了大部分内存,然而,这些浮点数组的总粗略大小应该是1.3Gb(好吧,我知道如何存储数据取决于JVM,但我没有预料到内存消耗会有2-3倍的差异)。
我试图使用 Snappy 压缩器即时压缩/解压缩数据(内存消耗下降到 3.5Gb),但性能下降了几次,这不是很可以接受。此外,当用 BufferedImage 替换这些浮点数 [][] 时,我正在测试性能,但性能非常差。
因此,还有2种方法可以降低内存消耗:1)为浮点数[][]数组编写包装器,以节省“零”元素(有很多“空”行和列)2)远离“2的幂”
这两种方式都需要相当多的编码/重构,所以当我在考虑“成为或不成为”时 - 伙计们,你可能对这个问题有更好的线索吗?
谢谢!
经过更详细的调查 - JVM似乎以“UnlockEperimentalFeatures”和“use GC1”标志启动。结果 - 有相当多的 NOT 垃圾回收“无法访问”的 BufferedImage 栅格(其中包含 byte[] 数组)。当从“YourKit”priofiler 调用 GC 时 - 那些从堆中删除的对象(这对我来说当然是不可接受的方式,因为我期望 JVM 会自己管理堆)。
我想对所有花时间帮助我的人说声谢谢。特别感谢Jim Garrison(看起来我只是将内存需求推迟了一段时间,移除了上面提到的标志,但是当更多的数组开始运行时,购买更多的内存将是避免性能损失的最简单的方法。
FFT需要一个复杂的数组,其大小是实数据数组的两倍,即使在输入端从实数组转换回幅度数组也是如此。这可能是超出预期的内存使用量的两倍。
稀疏数组不适用于FFT,因为FFT中的中间步骤几乎总是填满整个复杂数组。
许多现代高性能FFT库,例如基于FFTW的FFT库,可以非常有效地处理FFT长度,而不仅仅是2次幂(任何长度只要是小素数的乘积,都可以非常有效的进行FFT)。这可以为许多尺寸节省大量2D填充。
3.2. 浮点数 Go语言提供了两种精度的浮点数,float32和float64。它们的算术规范由IEEE754浮点数国际标准定义,该浮点数规范被所有现代的CPU支持。 这些浮点数类型的取值范围可以从很微小到很巨大。浮点数的范围极限值可以在math包找到。常量math.MaxFloat32表示float32能表示的最大数值,大约是 3.4e38;对应的math.MaxFloat64常量大约是1.8
问题内容: 我有一个浮点数数组: 在数组上运行sort()后,我得到了: 请注意,JavaScript(节点)的5.8 …大于49.6…。这是为什么? 如何正确地对这些数字进行排序? 问题答案: 传递排序函数: 结果: 从MDN: 如果未提供compareFunction,则通过将元素转换为字符串并按字典顺序(“字典”或“电话簿”,而非数字)顺序比较字符串来对元素进行排序。
问题内容: 我很困惑为什么在这种情况下python为什么要添加一些额外的十进制数,请帮助解释 问题答案: 浮点数是一个近似值,它们不能精确存储十进制数。因为它们试图仅用64位表示很大范围的数字,所以它们必须在某种程度上近似。 意识到这一点非常重要,因为它会导致一些怪异的副作用。例如,你可能会非常合理认为,十批的总和会。尽管这似乎合乎逻辑,但在浮点数方面也是错误的: 您可能会认为。浮点世界再次不同意
11.1.3 浮点数 在计算机中,浮点数一般由三部分组成:数值的符号位、阶码和有效数字(以后简称为尾数)。这种浮点数是用科学记数法来表示的,即:浮点数=符号位.有效数字×2阶码。 Intel系列的协处理器支持3种形式的浮点数:短型浮点数(32位)、长型浮点数(64位)和临时浮点数(80位),它们分别对应单精度、双精度和扩展精度浮点数。这些浮点数的数据格式都符合IEEE-754标准,它们的具体格式如
4. 浮点数 浮点数在计算机中的表示是基于科学计数法(Scientific Notation)的,我们知道32767这个数用科学计数法可以写成3.2767×104,3.2767称为尾数(Mantissa,或者叫Significand),4称为指数(Exponent)。浮点数在计算机中的表示与此类似,只不过基数(Radix)是2而不是10。下面我们用一个简单的模型来解释浮点数的基本概念。我们的模型由
上一章我们曾遇到处理非整型数的问题。我们使用百分数代替小数,避开了这个问题。然而还有一种更通用的解决方案,即使用浮点数,可以同时表示小数和整数。C++有两种浮点类型:float和double,本书仅使用double型。 你可以创建浮点型变量并赋值,语法与使用其它数据类型一样。例如: double pi; pi = 3.14159; 声明变量同时赋值也是合法的: int x = 1; stri