簡體   English   中英

系統在運行python腳本時凍結

[英]system freezes on running a python script

我正在編寫一個用於多個信號基線校正的代碼。 代碼的結構是這樣的。

# for each file in a directory
    #read file and populate X vector
    temp = baseline_als(x,1000,0.00001)
    plt.plot(x-temp)
    plt.savefig("newbaseline.png")
    plt.close()

baseline_als函數如下。

def baseline_als(y, lam, p, niter=20):
        L = len(y)
        D = sparse.csc_matrix(np.diff(np.eye(L), 2))
        w = np.ones(L)
        for i in xrange(niter):
            W = sparse.spdiags(w, 0, L, L)
            Z = W + lam * D.dot(D.transpose())
            z = spsolve(Z, w*y)
            w = p * (y > z) + (1-p) * (y < z)
        return z

現在,當我在目錄中放置大約100個文件時,代碼工作正常,盡管由於復雜性非常高,需要時間。 但是當我的目錄中有大約10000個文件然后運行此腳本時,系統會在幾分鍾后凍結。 我不介意延遲執行,但無論如何腳本應該完成執行嗎?

在腳本中運行太多RAM時會占用太多RAM,請參閱為什么一個簡單的python腳本會導致我的系統崩潰

程序運行的過程存儲進程內存中計算的數組和變量,這些內存是ram並且它們在那里累積

可能的解決方法是在子進程中運行baseline_als()函數。 當子進程返回時,內存自動釋放,請參閱在Python中釋放內存

在子進程中執行函數:

from multiprocessing import Process, Queue

def my_function(q, x):
 q.put(x + 100)

if __name__ == '__main__':
 queue = Queue()
 p = Process(target=my_function, args=(queue, 1))
 p.start()
 p.join() # this blocks until the process terminates
 result = queue.get()
 print result

復制自: 是否可以在子進程中運行函數而無需線程化或編寫單獨的文件/腳本

通過這種方式,您可以防止ram被您的進程(程序)生成的未引用的舊變量占用

另一種可能性是調用垃圾收集器gc.collect()但是不建議這樣做(在某些情況下不工作)

更有用的鏈接:

內存使用情況,如何釋放內存

Python大變量RAM使用率

我需要通過在硬盤驅動器上存儲Python字典來釋放RAM,而不是在RAM中。 可能嗎?

我能夠阻止我的CPU達到100%然后通過使用time.sleep(0.02)來凍結。 這需要很長時間,但仍然可以完成執行。

請注意,您需要在使用之前import time

暫無
暫無

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

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