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

Posted

技术标签:

【中文标题】有没有办法降低 scipy/numpy 精度以减少内存消耗?【英文标题】:Is there a way to reduce scipy/numpy precision to reduce memory consumption? 【发布时间】:2010-10-11 20:23:11 【问题描述】:

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

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

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

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

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

【问题讨论】:

【参考方案1】:

在 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的RSS为2.3GB。

>>> 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 的 RAM,这一切都应该可以正常工作(就像对我一样)。有什么问题?

【讨论】:

感谢指向 rfftn 函数的指针;是的,那些做得很好。 f=rfftn(v)、f=array(f,dtype=np.complex64)、f=irfftn(f) 的峰值使用量反过来为 6224MByte。 (如果没有到 complex64 的中间转换,它使用 7754MByte ......有点紧)。 您的生产数组大小实际上是否大于 512^3?我不确定为什么你会看到我在上面的示例代码中看到的 RAM 使用量的 4 倍...... 请修改您所说的“单精度不存在,因为您的本机硬件是 128 位”的位——本机硬件的 128 位不超过 64 位,FFTW 在以下方面非常灵活支持两者。正如大卫的回答所示,scipy.fftpack.rfft 支持这一点:scipy.fftpack.rfft(v.astype(np.float32)).dtype 返回float32。不幸的是,即使在 2015 年,Numpy 的支持也落后于 Scipy:github.com/numpy/numpy/issues/6012【参考方案2】:

Scipy 0.8 将对几乎所有 fft 代码提供单精度支持(代码已经在主干中,因此如果您现在需要该功能,可以从 svn 安装 scipy)。

【讨论】:

以上是关于有没有办法降低 scipy/numpy 精度以减少内存消耗?的主要内容,如果未能解决你的问题,请参考以下文章

降低精度Sympy等价类

Unity - 通过降低精度减少动画文件的大小

SciPy/NumPy 导入指南

词嵌入降低分类精度

通过Scipy和Numpy使用Python将数据拟合到ODE系统

阿里架构师详解缓存架构:如何减少不必要的计算?