如何修复Python sqlite3中的内存泄漏?

如何修复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

我有一个查询,我想用sqlite3在多个.sqlite文件中执行。问题是当conn.close()执行用于运行上一个.sqlite文件的内存时,如果保存一些结果,则不会清除该内存

为了探究问题,我运行了内存配置文件:

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