gpt4 book ai didi

python - pyfftw 释放对数组的引用而不破坏计划

转载 作者:行者123 更新时间:2023-12-01 05:30:01 24 4
gpt4 key购买 nike

我有一大堆大型数组,需要一个又一个、重复地进行傅立叶变换,并且它们并不同时全部适合内存。典型的数组大小是 (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( 时,比仅执行计划慢 10 倍以上)数组,farray,标志=['FFTW_ESTIMATE,FFTW_DESTROY_INPUT'],线程=nthread,轴=[-1]))。但是,每个计划都包含对构建它时使用的数组的引用,这意味着将所有计划保留在内存中会导致我将所有数组也保留在内存中,这是我无法承受的。

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

PS。尽管计划多次重复使用该计划,但我还是使用 FFTW_ESTIMATE 而不是 FFTW_MEASURE,因为 FFTW_MEASURE 对于这些数组大小来说需要很长时间,并且当我指定时间时限制,性能并不比 FFTW_ESTIMATE 更好。

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

最佳答案

FFTW 计划本质上与一段内存相关联。但是,没有什么可以阻止您将同一 block 内存用于您的所有计划。因此,您可以创建一个足够大的数组来容纳所有可能的数组,然后在该数组的 View 上创建 FFTW 对象。

然后您可以使用 FFTW.__call__() 执行 FFT允许在执行之前更新数组的接口(interface)(当它们在步幅和对齐方面与原始数组一致时,开销很小)。

现在,FFTW 对象将使用新数组作为其内部数组。如果你想恢复到其他内存,可以使用 FFTW.update_arrays() .

关于python - pyfftw 释放对数组的引用而不破坏计划,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20456972/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com