为什么填充'我的测试sqlite数据库占用了这么多内存,并没有保存任何东西?

时间:2014-09-24 11:57:52

标签: python sqlite insert ram

我有以下脚本为我填写测试数据库。

#!/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()

现在,脚本占用了所有可用的RAM(当前在3GB的VM中运行 - 占用~2.8GB),大约2分钟(编辑:几秒钟内)并且从未到达if i % 100000 == 0:。 如果我终止它并检查test.db文件它是3KB大并且只包含表,没有条目。

我是否需要不时关闭并重新打开连接?

1 个答案:

答案 0 :(得分:1)

正如我的评论建议的那样,在返回包含许多元素的列表时,您应该考虑使用irange而不是range,尤其是如果您只打算使用列表一次。

不同之处在于实施。 range预先创建整个列表,并返回列表中的元素。 irange每次只创建并返回列表中的下一个元素,因此它不会在前面做很多工作。

根据我的知识,函数调用是可以互换的,所以只需用range替换代码中的irange,就可以看到更少的RAM消耗。

也请查看此问题:How is irange() any different from range() or xrange()?

修改

抱歉,我的回答有点快。正如我之前所写,使用xrange而不是irange。 何时使用其中一个:Should you always favor xrange() over range()?

在Python 3中使用range或xrange并不重要的原因是AFAIK,因为range实现为xrange。