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

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

但是一个f np.complex128 存储的消耗是令人震惊,而且我不能做更多的结果(e。g调节系数,然后 f=ifftn(f) )没有 MemoryError 回溯.

而不是安装一些更RAM和/或扩大我交换分区,还有一些方式控制这/顽固"默认的精度",并有计算complex64阵列,而不是?

我知道我可以降低这之后的 f=array(f,dtype=np.complex64);我要找到它实际上做FFT的工作32-位精度和半的记忆。

有帮助吗?

解决方案

它看起来并不像有任何的功能要做到这一点,在这的fft职能(见 http://www.astro.rug.nl/efidad/scipy.fftpack.basic.html ).

除非你能找到一个固定点FFT库蟒蛇,这是不可能的,您需要的功能存在,因为你的母硬件浮点格式是128位。它看起来像你可以使用的rfft方法得到真正的价值的部件(相位)的FFT,这将节省一半你RAM。

我跑下在交互式蟒蛇:

>>> 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'>

在这一点上RSS(居民设置的尺寸)的蟒蛇是265MB.

f = fft.fft(v)

在这一点上RSS python2.3GB。

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

在这一点上RSS下降到2.0GB,因为我已经免费的上诉

使用"fft。rfft(v)"计算实值的唯一结果1.3GB RSS。(几乎一半,预期)

这样做:

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

是最糟糕的世界,因为它第一次计算complex128版本(2.3GB)和随后的副本,到complex64版本(1.3GB)这意味着高峰RSS我的机器上是3.6GB,然后安定下来到1.3GB。

我认为,如果你已经有了4G RAM,这应该所有的工作就好了(因为它为我)。有什么问题?

其他提示

这0.8将有一个精密的支持几乎所有的fft代码(代码已经在后备箱,因此可以安装这从svn如果你需要的特征现在)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top