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