在我的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
回溯.
而不是安装更多的RAM和/或扩展我的交换分区,有没有办法控制scipy/numpy"默认精度"并让它计算一个complex64数组呢?
我知道我可以随后减少它f=array(f,dtype=np.complex64)
; 我希望它实际上以32位精度和一半内存进行FFT工作.
在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])
此时python的RSS(常驻集大小)为265MB.
f = fft.fft(v)
而此时的python 2.3GB的RSS.
>>> type(f)>>> type(f[0,0,0]) >>> 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内存,这应该都可以正常工作(就像它对我来说).有什么问题?