代码之家  ›  专栏  ›  技术社区  ›  timday

有没有一种方法可以降低scipy/numpy精度以减少内存消耗?

  •  7
  • timday  · 技术社区  · 17 年前

    在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工作。

    2 回复  |  直到 16 年前
        1
  •  5
  •   slacy    17 年前

    在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,因为我已经释放了V。

    使用“fft.rfft(v)”计算实际值只会得到1.3GB RSS。(几乎是预期的一半)

    做:

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

    这是两个世界中最糟糕的,因为它首先计算了complex128版本(2.3gb),然后将其复制到complex64版本(1.3gb),这意味着我的机器上的峰值RSS为3.6GB,然后又稳定到1.3gb。

    我认为,如果你有4GB内存,这一切都会正常工作(就像它对我一样)。怎么了?

        2
  •  4
  •   David Cournapeau    16 年前

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