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

时间:2014-05-28 14:05:54

标签: python memory-leaks sqlite

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

为了探讨我运行memory_profile的问题:

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。

现在假设我对数据做了些什么(例如保存对象中需要的东西)

Line #    Mem usage    Increment   Line Contents
================================================
29   19.336 MiB    0.000 MiB   @profile
30                             def my_func():
31   19.336 MiB    0.000 MiB       results = []                            
35   19.551 MiB    0.215 MiB       conn = sql.connect(db_file1)
36   34.879 MiB   15.328 MiB       for row in conn.execute(query):
37   34.879 MiB    0.000 MiB           d = Data()
38   34.879 MiB    0.000 MiB           d.i1, d.i2, d.i3, d.i4 = row[:4]
39   34.879 MiB    0.000 MiB           results.append(d)
40   34.879 MiB    0.000 MiB       conn.close()
41                             
42   34.879 MiB    0.000 MiB       conn = sql.connect(db_file2)
43   46.277 MiB   11.398 MiB       for row in conn.execute(query):
44   46.277 MiB    0.000 MiB           d = Data()
45   46.277 MiB    0.000 MiB           d.i1, d.i2, d.i3, d.i4 = row[:4]
46   46.277 MiB    0.000 MiB           results.append(d)
47   46.277 MiB    0.000 MiB       conn.close()

当conn.close()运行时,没有释放任何内容,保留了在运行查询期间分配的所有内存。我知道内存的增加部分与我保存结果的事实有关,但是当conn.close()执行时我应该看到减少。 任何想法为什么会发生这种情况,或者我能做些什么?

参考数据具有以下声明

class Data:
  pass

修改

我还使用以下函数计算了结果的大小,它的大小为11.45 MB,所以其他东西保持14 MB

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

0 个答案:

没有答案