PySerial脚本正在泄漏内存

时间:2013-09-28 22:31:33

标签: python memory-leaks pygame pyserial

我正在使用PySerial与集成电路板(ICB)一起持续监控几个红外(IR)发射器/传感器单元的状态(即检查IR光束是否断裂或清除),我的程序似乎大约一天后通过电脑的记忆吃。我怀疑这与PySerial有关,但我不确定。

一些项目背景:我有三个标记为1,2和3的红外发射器/传感器单元。如果没有任何一个光束损坏,ICB通过串行连接输出字符串'0'。如果单元1上的光束断开,则输出字符串“1”,单元2输出“2”,依此类推。假设在任何时间点只能打破一个光束是安全的。我已经将ICB编程为每1/10秒输出一个字符串值(0,1,2或3)。

通过以下代码,我使用PySerial读取ICB输出,并使用PyGame将每个波束断开的时间记录到最大时间(所有在Python 2.7中):

import pygame, serial

def breakLoop(cumulative_break_time, max_cumulative_break_time, ser, is_beam_broken_org):
    elapsed_break_time = 0.
    clock.tick() #Start clock.
    while (cumulative_break_time + elapsed_break_time < max_cumulative_break_time):
        ser.flushInput()
        is_beam_broken = int(ser.read(1))
        if is_beam_broken == is_beam_broken_org:
            elapsed_break_time += clock.tick()/1000.
        else:
            break
    cumulative_break_time += elapsed_break_time
    return cumulative_break_time, elapsed_break_time

#Initialize objects and constants
ser = serial.Serial()
ser.baudrate = 115200
ser.port = 'COM3'
ser.open()
clock = pygame.time.Clock()
max_cumulative_break_time = 900. 
cumulative_break_time = 0.
out_file = open('test.csv','w')

while cumulative_break_time < max_cumulative_break_time: #Enter main event loop.
    ser.flushInput()
    is_beam_broken = int(ser.read(1))
    if is_beam_broken:
        print 'Beam %s broken.' % is_beam_broken
        cumulative_break_time, elapsed_break_time = breakLoop(cumulative_break_time, max_cumulative_break_time, ser, is_beam_broken)
        print 'Beam %s un-broken.' % is_beam_broken
        print 'Elapsed break time was: ', elapsed_break_time, ' s'
        print 'Cumulative break time is now: ', cumulative_break_time, ' s'
        print''
        out_file.write(','.join([str(is_beam_broken),str(elapsed_break_time)]) + '\n')
        out_file.flush()
out_file.close()
ser.close()
print '\n\nDone! Press any key to quit.'
raw_input('')

现在,代码运行正常,但是当我让它运行一天左右时,我得到一个“内存不足”错误。我猜这与PySerial有关,因为我不断地从ICB读取输入...也许是因为我总是刷新串行缓冲区?我不认为刷新内存内容使相同的内存不可用...

另外,我阅读了PySerial的文档并遇到了这一行:

尚未实现/实现可能出现的问题:客户端和服务器之间的RFC 2217流控制(对象内部缓冲区在未读取时可能占用所有内存)。 < / p>

我不知道RFC 2217是什么,但我知道我在某种程度上泄漏了内存。

我真的很感激任何意见。我是在正确的轨道上吗?或者是否有其他原因导致我的脚本内存使用过多?

当然,如果有任何细节可以帮助我帮助我,我很乐意进一步解释:)

0 个答案:

没有答案