sqliteをインメモリで使ってみた
やりたいことは以下。全部できた。
インメモリDBは早い。
- インメモリで動かす
- 日付、日時を格納する
- 日時、日時の新しいN件だけをDB内に維持する
- 日付、日時の新しいM件を取り出す
import sqlite3 import time import datetime start=time.time() con = sqlite3.connect(":memory:") # ファイルの場合は280,000件で20秒 #con = sqlite3.connect("sqlitedb.db") # ファイルの場合は1000件で20秒 con.isolation_level = None # None で自動コミットモード cur = con.cursor() # Create table cur.execute('''CREATE TABLE stocks (date text, ts timestamp, trans text, symbol text, qty real, price real, hoge integer)''') for i in range(100): # Insert a row of data now = datetime.datetime.now() cur.execute("INSERT INTO stocks VALUES ('2006-01-05',?,'BUY','RHAT',100,35.14,?)",(now,str(i))) time.sleep(0.01) # Save (commit) the changes # con.commit() elapsed_time=time.time()-start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") # 新しいほうから3件だけを表示する。 for row in cur.execute("SELECT * From stocks ORDER BY ts DESC LIMIT 3"): print(row) print("-------------------------------------------") # レコード数を最新の6件だけ残して、古い行を削除する cur.execute("delete from stocks where ts IN (select ts from stocks order by ts desc LIMIT -1 OFFSET 6)") elapsed_time=time.time()-start print ("elapsed_time:{0}".format(elapsed_time) + "[sec]") for row in cur.execute("SELECT * From stocks"): print(row) # We can also close the connection if we are done with it. # Just be sure any changes have been committed or they will be lost. con.close()
実行結果
C:\Python34>C:\Python34\inmemorysqlite.py elapsed_time:1.5490062236785889[sec] ('2006-01-05', '2018-02-21 23:29:50.743637', 'BUY', 'RHAT', 100.0, 35.14, 99) ('2006-01-05', '2018-02-21 23:29:50.728037', 'BUY', 'RHAT', 100.0, 35.14, 98) ('2006-01-05', '2018-02-21 23:29:50.712437', 'BUY', 'RHAT', 100.0, 35.14, 97) ------------------------------------------- elapsed_time:1.5490062236785889[sec] ('2006-01-05', '2018-02-21 23:29:50.665637', 'BUY', 'RHAT', 100.0, 35.14, 94) ('2006-01-05', '2018-02-21 23:29:50.681237', 'BUY', 'RHAT', 100.0, 35.14, 95) ('2006-01-05', '2018-02-21 23:29:50.696837', 'BUY', 'RHAT', 100.0, 35.14, 96) ('2006-01-05', '2018-02-21 23:29:50.712437', 'BUY', 'RHAT', 100.0, 35.14, 97) ('2006-01-05', '2018-02-21 23:29:50.728037', 'BUY', 'RHAT', 100.0, 35.14, 98) ('2006-01-05', '2018-02-21 23:29:50.743637', 'BUY', 'RHAT', 100.0, 35.14, 99)
ログをディスクに吐いてるようなので、それもメモリにすればもうちょっと早くなる??未評価。
dbconnection =sqlite3.connect(":memory:", check_same_thread = False) dbconnection.isolation_level = None dbcursor = dbconnection.cursor() dbcursor.execute('PRAGMA temp_store=MEMORY;') dbcursor.execute('PRAGMA journal_mode=MEMORY;')