SQLAlchemy 使用不当导致内存泄漏?

2 投票
1 回答
3083 浏览
提问于 2025-04-16 15:07

我的程序每隔几秒就占用一兆内存。我听说Python在垃圾回收时不处理游标,所以我觉得我在使用pydbcsqlalchemy时可能做错了什么,可能是某个地方没有关闭连接?

#Set up SQL Connection
def connect():
        conn_string = 'DRIVER={FreeTDS};Server=...;Database=...;UID=...;PWD=...'
        return pyodbc.connect(conn_string)

metadata = MetaData()
e = create_engine('mssql://', creator=connect)
c = e.connect()
metadata.bind = c
log_table = Table('Log', metadata, autoload=True)

...
atexit.register(cleanup)
#Core Loop
line_c = 0
inserts = []
insert_size = 2000
while True:
        #line = sys.stdin.readline()
        line = reader.readline()
        line_c +=1
        m = line_regex.match(line)
        if m:  
                fields = m.groupdict()
                ...
                inserts.append(fields)
                if line_c >= insert_size:
                        c.execute(log_table.insert(), inserts)
                        line_c = 0
                        inserts = []

我是不是应该把元数据块或者其中的一部分移动到插入块里,并在每次插入后关闭连接呢?

编辑:
问:这样做后,内存会不会稳定下来?

答:只有在Linux把进程干掉的时候才会稳定下来 :-)(图表中不包括缓冲区/缓存的内存使用情况)

1 个回答

1

我不一定会把问题怪到SQLAlchemy上。可能是底层的驱动程序出了问题。一般来说,内存泄漏很难发现。不管怎样,你可以去SQLAlchemy的邮件列表问问,那里的核心开发者Michael Bayer几乎会回答每一个问题……也许在那里能更有机会得到真正的帮助……

撰写回答