有没有办法减少这/顽固精确度,以减少内存消耗?
-
05-07-2019 - |
题
在我的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如果你需要的特征现在)。