8

在我的 64 位 Debian/Lenny 系统(4GByte RAM + 4GByte 交换分区)上,我可以成功地做到:

v=array(10000*random([512,512,512]),dtype=np.int16)
f=fftn(v)

但是 f 是 anp.complex128的内存消耗是令人震惊的,我不能对结果做更多​​的事情(例如调制系数然后f=ifftn(f))而没有MemoryError回溯。

与其安装更多的 RAM 和/或扩展我的交换分区,是否有某种方法可以控制 scipy/numpy “默认精度”并让它计算一个 complex64 数组?

我知道我可以在之后使用f=array(f,dtype=np.complex64); 我希望它实际上以 32 位精度和一半的内存进行 FFT 工作。

4

2 回答 2

5

在 scipy 的 fft 函数中似乎没有任何函数可以执行此操作(请参阅http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html)。

除非您能够为 python 找到定点 FFT 库,否则您想要的函数不太可能存在,因为您的本机硬件浮点格式是 128 位。看起来您确实可以使用 rfft 方法来获取 FFT 的实值分量(无相位),这样可以节省一半的 RAM。

我在交互式 python 中运行了以下命令:

>>> from numpy import *
>>>  v = array(10000*random.random([512,512,512]),dtype=int16)
>>> shape(v)
(512, 512, 512)
>>> type(v[0,0,0])
<type 'numpy.int16'>

此时python的RSS(驻留集大小)为265MB。

f = fft.fft(v)

而此时python的RSS为2.3GB。

>>> type(f)
<type 'numpy.ndarray'>
>>> type(f[0,0,0]) 
<type 'numpy.complex128'>
>>> v = []

在这一点上,RSS 下降到 2.0GB,因为我已经释放了 v。

使用“fft.rfft(v)”计算实数值只会产生 1.3GB 的 RSS。(几乎一半,正如预期的那样)

正在做:

>>> f = complex64(fft.fft(v))

两全其美,因为它首先计算 complex128 版本(2.3GB),然后将其复制到 complex64 版本(1.3GB),这意味着我机器上的峰值 RSS 为 3.6GB,然后稳定到 1.3GB再次。

我认为如果你有 4GB RAM,这一切都应该很好(就像它对我一样)。有什么问题?

于 2009-03-06T21:54:55.333 回答
4

Scipy 0.8 将对几乎所有 fft 代码提供单精度支持(代码已经在主干中,因此如果您现在需要该功能,可以从 svn 安装 scipy)。

于 2009-03-21T02:38:55.250 回答