1

我有一大組大數組,需要一個接一個地重複進行傅立葉轉換,並且它們並不都同時適合內存。典型的數組大小是(350,250000),但是相當多變。一般程序是pyfftw在不破壞計劃的情況下釋放對數組的引用

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

編輯:實際上,構建計劃的緩慢只發生在我第一次構建該形狀的計劃(由於智慧,我猜),所以不存儲計劃的方法畢竟是有效的。不過,如果可以存儲沒有數組引用的計劃,那很好理解。

+0

也許一些智慧雜耍可以奏效?輸出智慧,刪除計劃,然後再次恢復智慧? – amaurea

回答

2

FFTW計劃是由那裏的自然聯繫到一塊記憶。然而,沒有什麼可以阻止你使用相同的一塊內存來存儲你的所有計劃。因此,您可以創建一個足夠大的單個陣列來存放所有可能的陣列,然後在視圖中創建FFTW對象到該陣列中。

然後,您可以使用FFTW.__call__()接口執行FFT,該接口允許在執行前更新陣列(當它們與步進和對齊中的原始陣列一致時,幾乎沒有開銷)。

現在,FFTW對象將具有新陣列作爲其內部陣列。如果你想恢復到其他內存,你可以使用FFTW.update_arrays()

相關問題