我有一大组大数组,它们需要一个接一个地,反复地进行傅立叶变换,而且它们不能同时放入内存中。典型的数组大小是(350250000),但变化很大。一般程序是
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释放它对数组的引用?毕竟,我计划将它们重新发布到循环中完全兼容的新数组中。如果没有,有没有其他方法来解决这个问题?我想我可以为单行或成堆的行制定计划,但这很容易导致减速。你知道吗
另外,我使用FFTW_ESTIMATE
而不是FFTW_MEASURE
,尽管计划多次重用该计划,因为FFTW_MEASURE
对于这些数组大小需要永远的时间,并且当我指定时间限制时,性能并不比FFTW_ESTIMATE
好。你知道吗
编辑:事实上,构建计划的缓慢性只发生在我第一次构建这种形状的计划时(我猜是因为智慧),所以不存储计划的方法毕竟是有效的。不过,如果可以在没有数组引用的情况下存储计划,那就很好地了解了。你知道吗
FFTW的计划本质上是和一段记忆联系在一起的。但是,没有什么可以阻止你在所有计划中使用相同的内存。因此,您可以创建一个足够大的数组来容纳所有可能的数组,然后在该数组中的视图上创建FFTW对象。你知道吗
然后可以使用FFTW.__call__()接口执行FFT,该接口允许在执行之前更新数组(当数组与原始数组的步幅和对齐方式一致时,开销很小)。你知道吗
现在,FFTW对象将新数组作为其内部数组。如果要还原回另一个内存,可以使用FFTW.update_arrays()。你知道吗
相关问题 更多 >
编程相关推荐