我有一个查询,我想用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