【问题标题】:pyfftw release references to arrays without destroying planpyfftw 释放对数组的引用而不破坏计划
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多