有没有办法减少scipy / numpy精度,以减少内存消耗?

时间:2009-03-06 21:08:29

标签: numpy scipy numerical matplotlib fft

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

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

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

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

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

2 个答案:

答案 0 :(得分: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 2.3GB的RSS。

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

我认为如果你有4GB内存,这应该都可以正常工作(就像我一样)。有什么问题?

答案 1 :(得分:4)

Scipy 0.8对几乎所有fft代码都有单精度支持(代码已经在主干中,所以如果你现在需要这个功能,你可以从svn安装scipy。)