我正在使用Python 2.7和SQLite。我正在構建一個數百萬行的數據庫。我只想偶爾寫出來,這會提高性能。我的想法是不時調用commit()。我已經用下面的代碼嘗試過了。中間的選擇表明我們獲得一致的讀取。但是,當我看光盤時,我看到一個文件example.db-journal。這一定是數據被緩存的地方。在這種情況下,這在性能方面沒有任何好處。是否有辦法將插入內容收集在內存中,然後將它們刷新到光盤?有一個更好的方法嗎?內存中的Python SQLite緩存
這裏是我的示例代碼:
import sqlite3
conn = sqlite3.connect('example.db')
c = conn.cursor()
c.execute('CREATE TABLE if not exists stocks (date text, trans text, symbol text, qty real, price real)')
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
t = ('RHAT',)
c.execute('SELECT date, symbol, trans FROM stocks WHERE symbol=?', t)
# Here, we get 2 rows as expected.
print c.fetchall()
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
c.execute("INSERT INTO stocks VALUES ('2006-01-05','BUY','RHAT',100,35.14)")
conn.commit()
t = ('RHAT',)
c.execute('SELECT date, symbol, trans FROM stocks WHERE symbol=?', t)
# Here, we get all the rows as expected.
print c.fetchall()
conn.close()
更新:
想我會放棄在任何情況下,一些代碼的更新過這個問題上運行。 我正在處理來自文本文件的超過500萬行,並需要一個位置來存儲數據以進行更多處理。我原本擁有內存中的所有數據,但內存不足。所以,我切換到SQLite的光盤緩存。我原來的在內存中版本的處理過程中,每50,000行從原始文本文件中花費約36秒。
經過測量,我在SQLite版本的批處理上花了大約500秒的時間花了660秒。根據該意見(感謝海報),我想出了下面的代碼:
self.conn = sqlite3.connect('myDB.db', isolation_level='Exclusive')
self.cursor.execute('PRAGMA synchronous = 0')
self.cursor.execute('PRAGMA journal_mode = OFF')
另外,我從後我的文本文件處理1000行提交。
if lineNum % 1000 == 0:
self.conn.commit()
因此,文本文件中的50,000行現在需要大約40秒。所以,我增加了11%的總時間,但是,記憶是不變的,這是更重要的。
您可能會使用像redis這樣的內存存儲。 – Pramod
如果您真的需要這個(措施!),您可以嘗試使用內存中的sqlite數據庫(「:memory:」),並將其內容定期轉儲到磁盤上的數據庫。 –