尚、Sqlite3は少なくとも最新のPython2.xでは内部に組み込まれている為、特に何かをインストールする必要はありません。
これもPythonのDocumentを参照して以下のようなコードを作成して実行しました。
#!/usr/bin/env python
import csv
import sqlite3
import time
if __name__ == '__main__':
start = time.time()
import csv
import sqlite3
import time
if __name__ == '__main__':
start = time.time()
c = sqlite3.connect('./testdb')
i = 0
reader = csv.reader(open("./neta.csv"))
for row in reader:
id = row[0]
value = row[1]
t = (id,value,)
c.execute('insert into hash (id,value) values(?,?)',t)
i += 1
if i % 100000 == 0:
c.commit()
print "commit! %d" % i
c.commit()
c.close()
end = time.time()
print end-start
前回同様、neta.csvというファイルを1件ずつ読み込み、testdbのhashテーブルに対してデータをinsertしてます。100万件のデータをinsertするのにかかった時間は27.1sでした。i = 0
reader = csv.reader(open("./neta.csv"))
for row in reader:
id = row[0]
value = row[1]
t = (id,value,)
c.execute('insert into hash (id,value) values(?,?)',t)
i += 1
if i % 100000 == 0:
c.commit()
print "commit! %d" % i
c.commit()
c.close()
end = time.time()
print end-start
・上記の例では10万件でcommit()するようにしましたが、30万件程度に1回のcommit()とした場合、若干パフォーマンスがあがりました。
・pythonのsqlite3モジュールはデフォルトではAutoCommitではないようで明示的にCommitしなければ、データが格納されません。因みに、Connectの際に以下のように変更する事でAutoCommitと出来るようです。
c = sqlite3.connect('./testdb',isolation_level=None)
やってみると、我慢出来ない位、遅くなります。