Python 为什么';填充';在我的测试中,sqlite db占用了如此多的RAM,并且不';我什么都没救?

Python 为什么';填充';在我的测试中,sqlite db占用了如此多的RAM,并且不';我什么都没救?,python,sqlite,insert,ram,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)

我有下面的脚本来填充测试数据库

#!/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),如果i%100000==0:,则从未达到
。
如果我终止它并检查
test.db
文件,它是3KB大的,只包含表,没有条目


<>我需要关闭和重新打开连接吗?

我的评论建议,在返回具有许多元素的列表时,应该考虑使用<代码> Irange< /Cord>,而不是<代码>范围>代码>,特别是如果您只使用列表一次的话,

区别在于执行<代码>范围
预先创建整个列表,并返回列表中的元素。
irange
每次只创建并返回列表中的下一个元素,因此它不需要做很多前期工作

据我所知,函数调用是可互换的,因此只需将代码中的
range
替换为
irange
,就可以减少RAM消耗

还可以查看此问题:

编辑:

对不起,我的回答有点快。使用
xrange
而不是像我之前写的那样使用
irange
。 关于何时使用其中一个而不是另一个:


在Python 3中使用range或xrange无关紧要的原因是,因为range被实现为xrange。

对于范围内的i(099999999)
预先分配整个列表。首先尝试用
irange
替换
range
。它被实现为一个生成器,将构建一个流而不是一个列表(概念上)。100个IO条目的列表是一个很大的列表:)感谢您提供的信息,我从未使用过
irange
。。我如何使用它?在python文档中找不到它..python 2或3?如果为3,则
range
可以,并且不会分配整个列表。如果不是,则使用xrange,而不是irange。另外,将
con.commit
移动到循环之后。插入速度很快,但提交速度非常慢,因此您希望在一次提交中批量处理尽可能多的工作。我可以使用以下两种方法之一-您建议Python 3使用
范围
,或者Python 2使用
x范围
?我尝试这样做-
用于irange中的I(0,99999999):
而不是
用于范围内的I(0,99999999):
,但是我得到了
name错误:没有定义名称“irange”
@DaedalusMythos是否将
range
更改为
xrange
对RAM消耗有任何影响:)?是的。绝对地RAM消耗现在非常低,可以正常工作@代达罗斯神话太棒了!:)我经常尝试实现我迭代的列表返回函数,作为生成器。无论何时使用流之类的东西,我都喜欢使用生成器。谢谢你接受我的回答:)