当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《有没有办法减少scipy/numpy精度,以减少内存消耗?》经验,为你挑选了1个好方法。

在我的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工作.



1> slacy..:

在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内存,这应该都可以正常工作(就像它对我来说).有什么问题?

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有