我有一大堆大型数组需要一个接一个地重复进行傅里叶变换,并且它们并非同时适合内存。典型的数组大小为(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
永远需要这些数组大小,并且当我指定时间限制时,性能并不比{FFTW_ESTIMATE
更好。 {1}}。
编辑:实际上,构建计划的缓慢只是在我第一次构建这种形状的计划时(由于智慧,我猜),所以不存储计划的方法毕竟是有效的。尽管如此,如果可以在没有数组引用的情况下存储计划,那么就可以了解它。
答案 0 :(得分:2)
FFTW计划本质上与一块内存相关联。但是,没有什么可以阻止您使用相同的内存来计算所有计划。因此,您可以为所有可能的数组创建一个足够大的单个数组,然后在视图中创建FFTW对象到该数组中。
然后,您可以使用FFTW.__call__()接口执行FFT,该接口允许在执行之前更新数组(当它们在步幅和对齐方式中与原始数组一致时,开销很小)。
现在,FFTW对象将新阵列作为其内部数组。如果要恢复到其他内存,可以使用FFTW.update_arrays()。