首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scipy.fftpack的内存使用

scipy.fftpack的内存使用
EN

Stack Overflow用户
提问于 2017-03-07 17:38:36
回答 1查看 1.2K关注 0票数 2

我有问题的高内存使用时,执行fft与with的fftpack。使用模块memory_profiler获得的示例:

代码语言:javascript
复制
Line #    Mem usage    Increment   Line Contents
================================================
 4   50.555 MiB    0.000 MiB   @profile
 5                             def test():
 6  127.012 MiB   76.457 MiB       a = np.random.random(int(1e7))
 7  432.840 MiB  305.828 MiB       b = fftpack.fft(a)
 8  891.512 MiB  458.672 MiB       c = fftpack.ifft(b)
 9  585.742 MiB -305.770 MiB       del b, c
10  738.629 MiB  152.887 MiB       b = fftpack.fft(a)
11  891.512 MiB  152.883 MiB       c = fftpack.ifft(b)
12  509.293 MiB -382.219 MiB       del a, b, c
13  547.520 MiB   38.227 MiB       a = np.random.random(int(5e6))
14  700.410 MiB  152.891 MiB       b = fftpack.fft(a)
15  929.738 MiB  229.328 MiB       c = fftpack.ifft(b)
16  738.625 MiB -191.113 MiB       del a, b, c
17  784.492 MiB   45.867 MiB       a = np.random.random(int(6e6))
18  967.961 MiB  183.469 MiB       b = fftpack.fft(a)
19 1243.160 MiB  275.199 MiB       c = fftpack.ifft(b)

我试图理解这里发生的事情:

  1. fft和ifft在第7和第8行分配的内存量超过了它们返回结果所需的内存。对于调用b = fftpack.fft(a),将分配305个MiB。b数组所需的内存量为16 B/value * 1e7 values = 160 MiB (当代码返回complex128时,每个值为16B)。看起来fftpack正在分配某种类型的工作区,并且该工作区的大小与输出数组(?)相同。
  2. 在第10行和第11行上,将再次运行相同的过程,但这一次的内存使用量更少,更符合我的预期。因此,fftpack似乎能够重用工作区。
  3. 在第13-15行和第17-19行中,执行不同的、较小的输入大小。在这两种情况下,所分配的内存都多于所需的内存,并且内存似乎没有被重用。

上面报告的内存使用情况与windows任务管理器报告的内容是一致的(准确地说,我能够读取这些图表)。如果我编写这样一个具有较大输入大小的脚本,我可以使我的(windows)计算机非常慢,表明它正在交换。

第二个示例说明分配给工作区的内存问题:

代码语言:javascript
复制
factor = 4.5
a = np.random.random(int(factor * 3e7))
start = time()
b = fftpack.fft(a)
c = fftpack.ifft(b)
end = time()
print("Elapsed: {:.4g}".format(end - start))
del a, b, c
print("Finished first fft")

a = np.random.random(int(factor * 2e7))
start = time()
b = fftpack.fft(a)
c = fftpack.ifft(b)
end = time()
print("Elapsed: {:.4g}".format(end - start))
del a, b, c
print("Finished first fft")

代码打印如下:

代码语言:javascript
复制
Elapsed: 17.62
Finished first fft
Elapsed: 38.41
Finished first fft
Filename: ffttest.py

注意第二个fft是如何计算的,它的输入大小较小,是计算时间的两倍多。我注意到我的计算机在执行这个脚本时非常慢(可能是交换)。

问题:

  • 在不需要额外工作空间的情况下,可以在内部计算fft值,这是正确的吗?如果是的话,为什么fftpack不这样做呢?
  • 这里有什么问题吗?即使需要额外的工作空间,当fft以不同的输入大小重新运行时,为什么不重用它的工作区呢?

编辑:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-07 18:01:07

这是一个已知的问题,并且是由fftpack缓存其计算给定大小的fft的策略引起的。该缓存大约与计算的输出一样大,因此,如果使用不同输入大小的内存执行大的fft,那么内存消耗就会变得很大。

这里详细描述了这个问题:

https://github.com/scipy/scipy/issues/5986

Numpy也有类似的问题,目前正在着手解决:

https://github.com/numpy/numpy/pull/7686

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42654720

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档