如何修复Python sqlite3中的内存泄漏?
我有一个查询,我想用sqlite3在多个.sqlite文件中执行。问题是当conn.close()执行用于运行上一个.sqlite文件的内存时,如果保存一些结果,则不会清除该内存 为了探究问题,我运行了内存配置文件:如何修复Python sqlite3中的内存泄漏?,python,memory-leaks,sqlite,Python,Memory Leaks,Sqlite,我有一个查询,我想用sqlite3在多个.sqlite文件中执行。问题是当conn.close()执行用于运行上一个.sqlite文件的内存时,如果保存一些结果,则不会清除该内存 为了探究问题,我运行了内存配置文件: Line # Mem usage Increment Line Contents ================================================ 29 19.324 MiB 0.000 MiB @profile 30
Line # Mem usage Increment Line Contents
================================================
29 19.324 MiB 0.000 MiB @profile
30 def my_func():
35 19.543 MiB 0.219 MiB conn = sql.connect(db_file1)
36 22.293 MiB 2.750 MiB for row in conn.execute(query):
37 22.293 MiB 0.000 MiB print row
38 19.953 MiB -2.340 MiB conn.close()
39
40 19.953 MiB 0.000 MiB conn = sql.connect(db_file2)
41 22.293 MiB 2.340 MiB for row in conn.execute(query):
42 22.293 MiB 0.000 MiB print row
43 19.953 MiB -2.340 MiB conn.close()
如果我对数据不做任何处理,只要在conn.close()运行2.3 MiB时将其打印出来即可
现在假设我对数据做了一些事情(例如,在对象中保存我需要的东西)
当conn.close()运行时,不释放任何内容,则保留运行查询期间分配的所有内存。我知道内存的增加部分与我正在保存结果有关,但是当conn.close()执行时,我应该会看到内存的减少。
你知道为什么会这样,或者我能做什么吗
参考数据有以下声明
class Data:
pass
编辑
我还用下面的函数计算了结果的大小,它是11.45MB,所以其他的东西是14MB
def calc_memory(results):
mem = 0
for res in results:
mem += sys.getsizeof(res)
mem += sys.getsizeof(res.i1)
mem += sys.getsizeof(res.i2)
mem += sys.getsizeof(res.i3)
mem += sys.getsizeof(res.i4)
mem += sys.getsizeof(results)
return mem
您在哪里关闭游标?我没有使用游标,只是使用连接.execute(sql[,可选参数])函数和执行返回的内容。我的理解是,当您在连接上使用execute语句时,sqlite3会创建一个临时游标。顺便说一下,我现在用光标做了同样的事情,得到了同样的记忆行为
def calc_memory(results):
mem = 0
for res in results:
mem += sys.getsizeof(res)
mem += sys.getsizeof(res.i1)
mem += sys.getsizeof(res.i2)
mem += sys.getsizeof(res.i3)
mem += sys.getsizeof(res.i4)
mem += sys.getsizeof(results)
return mem