1

我有一大组大型数组需要一个接一个地反复进行傅里叶变换,而且它们不能同时全部放入内存中。典型的数组大小为 (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对于我来说在循环内执行它也太慢了(当构建它时比执行计划慢 10 倍以上pyfftw.FFTW(array, farray, flags=['FFTW_ESTIMATE,FFTW_DESTROY_INPUT'], threads=nthread, axes=[-1]))。但是,每个计划都包含对构造它时使用的数组的引用,这意味着将所有计划保存在内存中导致我也将所有数组保存在内存中,这是我负担不起的。

是否可以让 pyfftw 释放它对数组的引用?毕竟,无论如何,我打算将它们重新指向循环内完全兼容的新数组。如果没有,还有其他方法可以解决这个问题吗?我想我可以为单行或多行制定计划,但这很容易导致减速。

PS。我使用FFTW_ESTIMATE而不是FFTW_MEASURE尽管计划多次重用该计划FFTW_MEASURE,因为这些数组大小需要永远,并且当我指定时间限制时,性能并不比 for 好FFTW_ESTIMATE

编辑:实际上,构建计划的缓慢只发生在我第一次构建这种形状的计划时(我猜是因为智慧),所以不存储计划的方法毕竟有效。不过,如果可以在没有数组引用的情况下存储计划,那就太好了。

4

1 回答 1

2

FFTW 计划本质上是与一段记忆联系在一起的。但是,没有什么可以阻止您为所有计划使用一块内存。因此,您可以为所有可能的数组创建一个足够大的单个数组,然后在该数组的视图上创建 FFTW 对象。

You can then execute the FFT using the FFTW.__call__() interface that allows the arrays to be updated prior to execution (with little overhead when they agree with the original array in strides and alignment).

Now, the FFTW object will have the new arrays as its internal arrays. If you want to revert back to the other memory, you can use FFTW.update_arrays().

于 2014-01-27T12:23:25.733 回答