Skip to main content
 首页 » 编程设计

python之SQLAlchemy 误用导致内存泄漏

2025年05月04日11emanlee

我的程序每隔几秒就消耗一兆。我读到 python 在垃圾收集中看不到 curors,所以我觉得我在使用 pydbc 和 sqlalchemy 时可能做错了,也许没有关闭某处的东西?

#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 = [] 

我是否应该将元数据 block 或其中的一部分移动到插入 block 并在每次插入时关闭连接?

编辑:
问:它都稳定了吗?

答:只有当你算上 Linux 吹走了进程时:-)(图表确实从内存使用中排除了缓冲区/缓存)

请您参考如下方法:

我不一定会责怪 SQLAlchemy。也可能是底层驱动的问题。一般来说,内存泄漏很难检测到。在任何情况下,您都应该在 SQLALchemy 邮件列表上询问核心开发人员 Michael Bayer 几乎 每个问题...也许在那里获得真正帮助的更好机会...