我今天正在查看sqlite3的Python单元测试,我发现了一些很棒的内容
sqlite.connect(":memory:")
这是一个非常酷的想法,使单元测试更容易编写。但后来我开始疑惑,sqlite3总是使用了处理内存吗? sqlite3足够聪明,可以在交互模式下解除分配吗?
答案 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。
Small Note,OSX活动监视器将python解释器识别为"终端"可能是因为它没有检查孩子的记忆力使用情况(不看叉子)。
第二个屏幕截图是在解释器中调用exit()之后。内存使用率仍为~488mb。简而言之,内存不会在解释器出口处解除分配。
<强>更新强> 原始测试是3.4。刚刚确认为2.7。
<强> UPDATE2:强> 用htop再次尝试测试。
显然,教训并不是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")
后,内存使用情况未再次释放。创建一个新的测试数据库并再次插入行不会导致额外的内存分配,因此看起来内存只是没有返回到操作系统。