簡體   English   中英

循環瀏覽大量文件並保存數據圖的最快/最有效方法是什么?

[英]What is the fastest/most efficient way to loop through a large collection of files and save a plot of the data?

因此,我有一個程序,該程序循環遍歷約2000多個數據文件,執行傅立葉變換,繪制變換,然后保存圖形。 感覺程序運行時間越長,獲得的速度就越慢。 是否可以通過以下代碼的簡單更改使它運行得更快或更干凈?

以前,我將傅里葉變換定義為一個函數,但是我在這里讀到某處python具有較高的調用函數開銷,因此我取消了該函數,並且一直在直接運行。 另外,我讀到clf()擁有以前數據的穩定記錄,如果您循環瀏覽許多圖,它們可能會變得很大並減慢該過程,因此我將其更改為close() 這些好的變化在哪里?

from numpy import *
from pylab import *

for filename in filelist:

    t,f = loadtxt(filename, unpack=True)

    dt = t[1]-t[0]
    fou = absolute(fft.fft(f))
    frq = absolute(fft.fftfreq(len(t),dt))

    ymax = median(fou)*30

    figure(figsize=(15,7))
    plot(frq,fou,'k')

    xlim(0,400)
    ylim(0,ymax)

    iname = filename.replace('.dat','.png')
    savefig(iname,dpi=80)
    close()

您是否考慮過使用multiprocessing模塊來並行處理文件? 假設您實際上在這里受CPU限制(這意味着傅立葉轉換占用了大部分運行時間,而不是讀寫文件),這應該可以加快執行時間,而實際上並不需要加快循環本身。

編輯:

例如,如下所示(未經測試,但應該可以給您帶來靈感):

def do_transformation(filename)
    t,f = loadtxt(filename, unpack=True)

    dt = t[1]-t[0]
    fou = absolute(fft.fft(f))
    frq = absolute(fft.fftfreq(len(t),dt))

    ymax = median(fou)*30

    figure(figsize=(15,7))
    plot(frq,fou,'k')

    xlim(0,400)
    ylim(0,ymax)

    iname = filename.replace('.dat','.png')
    savefig(iname,dpi=80)
    close()

pool = multiprocessing.Pool(multiprocessing.cpu_count())
for filename in filelist:
    pool.apply_async(do_transformation, (filename,))
pool.close()
pool.join()

您可能需要調整工作進程中實際完成的工作。 例如,嘗試並行化磁盤I / O部分可能對您沒有多大幫助(甚至傷害您)。

是的,增加收盤價是不錯的選擇。 它應該有助於解決您的內存泄漏問題。 我還建議將圖形,繪圖和關閉命令移出循環-只需更新由plot創建的Line2D實例即可。 查看以獲取更多信息。

注意:我認為這應該可行,但是我還沒有在這里進行測試。

我測試了與您在ipython中所做的類似的事情,並且我注意到當目錄中包含很多文件時,循環變得相當慢。 該目錄中的文件系統似乎具有與該文件夾中的文件數有關的開銷,可能與以下內容的查找時間有關:

loadtxt(filename, unpack = true)

您可以嘗試通過將文件列表分成較小的塊,然后將每個塊保存在不同的目錄中,在將圖保存為塊的位置進行拆分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM