我今天查看了 sqlite3 的 Python 单元测试,发现了一些很棒的东西
sqlite.connect(":内存:")
这是一个非常酷的想法,它使单元测试更容易编写。但后来我开始想知道,sqlite3 是否总是释放已使用的内存? sqlite3 是否足够智能,可以在交互模式下解除分配?
最佳答案
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。
小提示,OSX 事件监视器将 python 解释器识别为“终端”,可能是因为它不检查子进程的内存使用情况(不查看 fork )。
第二个屏幕截图是在解释器中调用 exit() 之后的。内存使用量仍然约为 488mb 简而言之,解释器退出时内存不会被释放。
更新: 原来的测试是3.4。刚刚确认 2.7。
更新2: 再次尝试使用 htop 进行测试。
显然,教训不是 python.sqlite3 不会在交互模式下释放,而是你不应该使用 OSX 事件监视器来测试内存使用情况。
这里没什么可看的,继续走吧。
关于python - python sqlite3 是否在交互模式下释放仅内存数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23095221/