【发布时间】:2013-12-08 18:07:54
【问题描述】:
我有一大组大型数组需要一个接一个地反复进行傅里叶变换,而且它们不能同时全部放入内存中。典型的数组大小为 (350,250000),但变化很大。一般程序是
while True:
for data in data_set:
array = generate_array(data)
fft(array,farray)
do_something_with_farray()
ifft(farray,array)
do_something_with_array()
这需要很快,所以理想情况下我会事先为所有数组制定计划,并在循环中重用它们。这一点尤其重要,因为即使使用FFTW_ESTIMATE 构建计划对我来说在循环内执行它也太慢了(在将其构建为pyfftw.FFTW(array, farray, flags=['FFTW_ESTIMATE,FFTW_DESTROY_INPUT'], threads=nthread, axes=[-1]) 时,比仅执行计划慢10 倍以上)。但是,每个计划都包含对构造它时使用的数组的引用,这意味着将所有计划保留在内存中导致我也将所有数组保留在内存中,这是我负担不起的。
是否可以让 pyfftw 释放它对数组的引用?毕竟,无论如何,我打算将它们重新指向循环内完全兼容的新数组。如果没有,还有其他方法可以解决这个问题吗?我想我可以为单行或多行制定计划,但这很容易导致速度变慢。
PS。我使用FFTW_ESTIMATE 而不是FFTW_MEASURE,尽管我计划多次重复使用该计划,因为FFTW_MEASURE 需要永远用于这些数组大小,并且当我指定时间限制时,性能并不比FFTW_ESTIMATE 好。
编辑:实际上,构建计划的缓慢只发生在我第一次构建这种形状的计划时(我猜是出于智慧),所以不存储计划的方法毕竟有效。不过,如果可以在没有数组引用的情况下存储计划,那就太好了。
【问题讨论】:
-
也许一些智慧的杂耍可以奏效?导出智慧,删除计划再恢复智慧?
标签: python memory-management scientific-computing reference-counting pyfftw