2010年11月28日日曜日

PythonでSqlite3に大量のデータをInsertしてみた

次はPython2.xでSqlite3に対して大量のデータをinsertしてみました。
尚、Sqlite3は少なくとも最新のPython2.xでは内部に組み込まれている為、特に何かをインストールする必要はありません。

これもPythonのDocumentを参照して以下のようなコードを作成して実行しました。
#!/usr/bin/env python
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でした。

・上記の例では10万件でcommit()するようにしましたが、30万件程度に1回のcommit()とした場合、若干パフォーマンスがあがりました。
・pythonのsqlite3モジュールはデフォルトではAutoCommitではないようで明示的にCommitしなければ、データが格納されません。因みに、Connectの際に以下のように変更する事でAutoCommitと出来るようです。
c = sqlite3.connect('./testdb',isolation_level=None)
やってみると、我慢出来ない位、遅くなります。