我在JTransfroms中有关于{1850 000,1}元素的向量.. 但记录:
exception in thread "main" java.lang.OutOfMemoryError: Java heap space 1350 000
它有效...但仍然需要大约1分钟!!它对我来说太多了......有线程.. 在matlab中大约需要2秒。在Jtrans的官方网站上。
:限制:1D变换不是2个幂的大小是顺序的 (当使用混合基数时)。 1D转换为两种尺寸的功率 只能使用2或4个线程。
线程数必须是2的幂数。
有人可以解释这两种尺寸的尺寸是什么吗?
答案 0 :(得分:0)
两个的力量(有计算机如此存在)数字只有因子2.那么2,4,8,16,...,1024 2048等等所以如果你用作输入一个正好为1024的向量数字,它应该更快。
我无法真正说出“关于{1850 000,1}元素”的含义,但也许你的数字要高得多?该库不会过多地使用超过4个线程(无论如何在许多系统上都不会做太多),因此您不应该获得大量的速度增益。也许还有其他问题。
答案 1 :(得分:0)
我将发布一些FFT背景来解释基数-2的限制。
首先要注意的是大多数FFT实现使用C-T FFT Algorithm.这可以通过将FFT分成越来越小的FFT来实现,就像Merge-sort首先将排序限制为基本情况一样。
C-T算法最常做 的方式是将问题除以半(N = N0 / 2
)。这并不是说混合基数案例是不可能的,但由于以下原因,“二次幂”案例效率最高,因此也是最常用的案例。
现在大多数FFT实现的主要瓶颈不是算法的实现,而是硬件 - 处理器流水线等等。显然,这些都是基于二进制逻辑基础,导致带宽几乎完全是2 N 。
由于这个原因,在寄存器中精确拟合并精确细分原始问题,因此在内存中使用2 N 字节的FFT计算速度会更快。
TL; DR:使用无关数据(0)填充FFT向量,直到达到最接近的2的幂。然后仅使用有效的结果数据。
然而,您的异常看起来就像是内存不足。您使用的是32位操作系统吗?如果是这样的话,您可能会因为大量操作而超过分配的2GB进程内存或其他约束。