Die in der Antwort verwendeten Tricks (verwenden Sie gc.collect, um Müll manuell zu sammeln und Speicher freizugeben) funktionieren, sind aber ziemlich langsam.
Mein Problem ist, dass ich diese Schleife mit 500 Hz ausführen muss:
- ohne Garbage Collector: Speicher Leck, aber 0,3-0,4 ms/Schleife
- mit gc.collect() in der Schleife: 11 ms/Schleife !!!
Meine Frage ist: Was sind die anderen Alternativen? zum gc.collect, was gut funktioniert, aber zu langsam ist. Ich kann es nicht alle 1000 Zyklen einmal aufrufen, da dieser bestimmte Zyklus extrem langsam sein wird und ich eine zuverlässige Frequenz benötige.
Der Code, den ich zum Testen verwende, ist der folgende:
Code: Select all
import pandas as pd
import os
import gc
from multiprocessing import Process,Pipe
import time
a,b=Pipe()
def sender(a): # this one does not leak
print "sender :", os.getpid()
while True:
Data=pd.DataFrame([[1.,2.,3.]],columns=['a','b','c'])
a.send(Data)
def main(b): ### this one cause a memory "leak" !!!!! only when the pipe is on
try:
print "receiver :", os.getpid()
i=0
#t=time.time() # for timing purpose
while True:
Data=b.recv()
cmd=Data['a'].values[0]
i+=1
#gc.collect() # remove the memory leak, but slooooooow
#if i%1000==0: # loop for timing purpose
#t1=time.time()
#print i
#print (t1-t)/1000
#t=t1
except (Exception,KeyboardInterrupt) as e:
print "Exception : ", e
raise
try:
p=Process(target=main,args=(b,))
q=Process(target=sender,args=(a,))
p.start()
q.start()
except (Exception,KeyboardInterrupt) as e:
print "Exception in main : ", e
p.terminate()
q.terminate()
Mobile version