gpt4 book ai didi

python - scipy.fftpack 的内存使用情况

转载 作者:太空宇宙 更新时间:2023-11-03 15:34:21 24 4
gpt4 key购买 nike

使用 scipy 的 fftpack 执行 fft 时,我遇到内存使用率过高的问题。使用模块 memory_profiler 获得的示例:

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. 第 7 行和第 8 行中 fft 和 ifft 分配的内存量超过了它们返回结果所需分配的内存量。对于调用 b = fftpack.fft(a),分配了 305 MiB。 b 数组所需的内存量为 16 B/值 * 1e7 值 = 160 MiB(每个值 16 B,因为代码返回 complex128)。看起来 fftpack 正在分配某种类型的工作空间,并且工作空间的大小与输出数组的大小相等(?)。

  2. 在第 10 行和第 11 行,再次运行相同的过程,但这次内存使用量较少,更符合我的预期。因此,fftpack 似乎能够重用工作空间。

  3. 第 13-15 行和第 17-19 行使用不同的较小输入大小执行 fft。在这两种情况下,分配的内存都多于所需的内存,并且内存似乎没有被重用。

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

第二个例子来说明为工作空间分配的内存问题:

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")

代码打印以下内容:

Elapsed: 17.62
Finished first fft
Elapsed: 38.41
Finished first fft
Filename: ffttest.py

请注意,第二个 fft(其输入大小较小)的计算时间是原来的两倍以上。我注意到我的计算机在执行此脚本期间非常慢(可能正在交换)。

问题:

  • 可以就地计算 fft,而不需要额外的工作空间,这是否正确?如果是这样,为什么 fftpack 不这样做?

  • 这里的fftpack有问题吗?即使它需要额外的工作空间,为什么当使用不同的输入大小重新运行 fft 时它不重用其工作空间?

编辑:

最佳答案

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

问题详细描述如下:

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

Numpy 有类似的问题,正在解决:

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

关于python - scipy.fftpack 的内存使用情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42654720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com