大熊猫

时间:2015-10-28 16:35:35

标签: python python-2.7 pandas memory-leaks garbage-collection

pandas Dataframe出现“内存泄漏”问题。显然这是一个知道问题:Memory leak using pandas dataframe

答案中使用的技巧(使用gc.collect手动收集垃圾和空闲内存),但效果很慢。

我的问题是我需要以500Hz运行此循环:

  • 没有垃圾收集器:内存泄漏,但是0.3-0.4ms / loop
  • 在循环中使用gc.collect():11ms / loop !!!

(在1000个循环上测试,time.time():可能不准确,但可以很好地了解问题)

我的问题是:gc.collect的其他替代方法是什么,哪种方法可以正常但速度太慢。我不能在1000个周期内调用一次,因为这个特定的周期非常慢,我需要一个可靠的频率。

我用于测试的代码如下:

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

0 个答案:

没有答案