繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM