[英]Why does the 'filling' of my test sqlite db take up so much RAM and doesn't save anything?
我有以下脚本为我填充测试数据库。
#!/usr/bin/python
import random, sys, sqlite3
con = sqlite3.connect('test.db')
cur = con.cursor()
cur.execute("DROP TABLE IF EXISTS EXAMPLE")
cur.execute("CREATE TABLE EXAMPLE(FIRST TEXT, SECOND TEXT)")
for i in range(0, 99999999):
one = format(i, '08d')
two = "%0.8d" % random.randint(0,99999999)
cur.execute("INSERT INTO EXAMPLE VALUES(\'"+one+"\',\'"+two+"\')")
con.commit()
# to have some feedback of the progress
if i % 100000 == 0:
print (str(i))
con.close()
print ("done")
# wait in the script..
sys.stdin.readline()
现在,脚本将在大约2分钟内(它在几秒钟内)占用所有它可能的RAM(当前在具有3GB的VM中运行-占用约2.8GB),并且从未达到if i % 100000 == 0:
如果我终止它并检查test.db
文件,它的大小为3KB,仅包含该表,没有任何条目。
我是否需要不时关闭并重新打开连接?
正如我的评论所建议的那样,返回包含许多元素的列表时,应该考虑使用irange
而不是range
,特别是如果您只打算使用一次列表时。
区别在于实现。 range
创建整个列表,然后返回列表中的元素。 irange
都会创建并返回列表中的下一个元素,因此它不会做太多的工作。
函数调用是可以互换的,据我所知,所以只需更换range
在你的代码irange
,你应该看到较少的内存消耗。
还要检查这个问题: irange()与range()或xrange()有何不同?
编辑:
抱歉,我的回答很快。 使用xrange
而不是我以前写的irange
。 对于何时在另一个之上使用: 您是否应该始终偏爱xrange()而不是range()?
在Python 3中使用range或xrange无关紧要的原因是AFAIK,因为range被实现为xrange。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.