python sqlite3是否以交互模式释放仅内存数据库?

时间:2014-04-15 21:52:28

标签: python memory sqlite

我今天正在查看sqlite3的Python单元测试,我发现了一些很棒的内容

sqlite.connect(":memory:")

这是一个非常酷的想法,使单元测试更容易编写。但后来我开始疑惑,sqlite3总是使用了处理内存吗? sqlite3足够聪明,可以在交互模式下解除分配吗?

2 个答案:

答案 0 :(得分:1)

OSX活动监视器未报告正确的内存使用情况。使用htop查看正确的使用统计信息。

首先,我以交互模式启动了解释器

python -i

然后在我写的解释器中

import sqlite3 as sqlite
db = sqlite.connect(":memory:")
db.execute("create table test(id integer primary key, test_text text)")
for i in range(50000000):
    db.execute("insert into test(test_text) values (?)", ("test",))

第一个屏幕截图是交互式python运行时的内存使用情况。内存使用量约为488mb。

enter image description here

Small Note,OSX活动监视器将python解释器识别为"终端"可能是因为它没有检查孩子的记忆力使用情况(不看叉子)。

enter image description here

第二个屏幕截图是在解释器中调用exit()之后。内存使用率仍为~488mb。简而言之,内存不会在解释器出口处解除分配。

<强>更新 原始测试是3.4。刚刚确认为2.7。

<强> UPDATE2: 用htop再次尝试测试。 enter image description here

enter image description here

显然,教训并不是python.sqlite3在交互模式下无法解除分配,因此您不应该使用OSX活动监视器来测试内存使用情况。

这里没什么可看的,继续前进。

答案 1 :(得分:0)

在:

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
ryan     27162  0.4  0.2  29492  5348 pts/7    S+   15:17   0:00 python

插入500000行后:

ryan     27162 14.3  0.7  45436 15064 pts/7    S+   15:17   0:13 python

db.close()之后

ryan     27162 11.9  0.4  38620  8368 pts/7    S+   15:17   0:13 python

但是,在插入500000行然后执行db.execute("drop table test")后,内存使用情况未再次释放。创建一个新的测试数据库并再次插入行不会导致额外的内存分配,因此看起来内存只是没有返回到操作系统。