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

#!/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,就可以减少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。

关于python - 为什么我的测试sqlite数据库的“填充”占用了这么多的RAM,却没有保存任何东西?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26016318/

10-09 12:56