我有问题的高内存使用时,执行fft与with的fftpack。使用模块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)我试图理解这里发生的事情:
b = fftpack.fft(a),将分配305个MiB。b数组所需的内存量为16 B/value * 1e7 values = 160 MiB (当代码返回complex128时,每个值为16B)。看起来fftpack正在分配某种类型的工作区,并且该工作区的大小与输出数组(?)相同。上面报告的内存使用情况与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是如何计算的,它的输入大小较小,是计算时间的两倍多。我注意到我的计算机在执行这个脚本时非常慢(可能是交换)。
问题:
编辑:
发布于 2017-03-07 18:01:07
这是一个已知的问题,并且是由fftpack缓存其计算给定大小的fft的策略引起的。该缓存大约与计算的输出一样大,因此,如果使用不同输入大小的内存执行大的fft,那么内存消耗就会变得很大。
这里详细描述了这个问题:
https://github.com/scipy/scipy/issues/5986
Numpy也有类似的问题,目前正在着手解决:
https://stackoverflow.com/questions/42654720
复制相似问题