[英]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()
但是不建議這樣做(在某些情況下不工作)
更有用的鏈接:
我能夠阻止我的CPU達到100%然后通過使用time.sleep(0.02)
來凍結。 這需要很長時間,但仍然可以完成執行。
請注意,您需要在使用之前import time
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.