2016-07-01 23 views
2

Ich schreibe einen Code für die Grundlinienkorrektur mehrerer Signale. Die Struktur des Codes ist so.System friert beim Ausführen eines Python-Skripts ein

# 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() 

Die baseline_als Funktion ist wie folgt.

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 

Nun, wenn ich um die 100 Dateien in einem Verzeichnis abgelegt, funktioniert der Code in Ordnung, aber es dauert seine Zeit, da die Komplexität recht hoch ist. Aber wenn ich ungefähr 10000 Dateien in meinem Verzeichnis habe und dann dieses Skript ausführe, friert das System nach wenigen Minuten ein. Mir macht eine Verzögerung bei der Ausführung nichts aus, aber gibt es trotzdem, dass das Skript die Ausführung beenden sollte?

+0

Haben Sie irgendeine Art von Systemmonitor ausgeführt werden, wenn der Code "einfriert"? – cdarke

+0

Ich bin mir nicht sicher, wie ich einen Systemmonitor ausführen kann. Da Maus und Tastatur nicht mehr reagieren und ich neu starten muss. –

+1

Sie sagen nicht, welches Betriebssystem Sie verwenden. Starten Sie den Monitor, bevor Sie Ihr Programm starten. Wenn Sie neu starten müssen, könnte etwas anderes passieren. Hast du deinen ganzen Code gezeigt? – cdarke

Antwort

0

Ich konnte verhindern, dass meine CPU 100% erreicht und dann unter Verwendung von time.sleep(0.02) einfriert. Es dauert lange, aber die Ausführung ist trotzdem abgeschlossen.

Beachten Sie, dass Sie import time verwenden müssen, bevor Sie dies verwenden.

0

im Skript wird zu viel RAM verbraucht, wenn Sie es über eine zu große Anzahl von Dateien ausführen, in Why does a simple python script crash my system

Der Prozess sehen, dass Ihr Programm läuft speichert die Felder und Variablen für die Berechnungen in Prozessspeicher Das ist RAM und dort akkumulieren sie

Eine mögliche Problemumgehung ist die baseline_als() Funktion in einem untergeordneten Prozess auszuführen. Wenn das Kind zurückkehrt wird der Speicher automatisch freigegeben, siehe Releasing memory in Python

Funktion in Kindprozess ausführen:

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 

kopiert: Is it possible to run function in a subprocess without threading or writing a separate file/script

damit Sie verhindern, dass ram von unreferenced alten Variablen verbraucht wird, dass Ihr Prozess (Programm) produziert

eine andere Möglichkeit ist vielleicht, von der Müllsammler gc.collect() aufrufen, aber dies ist nicht zu empfehlen (nicht in einige Fälle)

Weitere nützliche Links:

memory usage, how to free memory

Python large variable RAM usage

I need to free up RAM by storing a Python dictionary on the hard drive, not in RAM. Is it possible?