2011年1月24日月曜日

PythonでPostgresqlに大量のデータをINSERTしてみた

Python2.xでPostgresqlに大量データのInsertを試みました。
まず、SqliteやMongodbとかでやったときとの違いとしては選択出来るDriverが多いのです。

①ocpgdb1.0.3
②psycopg2-2.3.2
③PyGreSQL4.0
④pg8000-1.08
ドライバの版数は直近のものです。どれがいい・・というのは特には無さそうです。しかし、Installしてみると、④以外は全てErrorとなりました。コンパイルでエラーになるというのが共通です。何だかなー。因みに環境はFedora13+Python2.6.4+Postgresql9.0です。

サンプルみたいなものはあんまりWeb上には無いので、Manualを読みながらやってみました。

#!/usr/bin/env python
import csv
from pg8000 import DBAPI
import time

if __name__ == '__main__':
    start = time.time()
    c = DBAPI.connect(host="localhost",user="postgres",database="testdb")
    i = 0
    reader = csv.reader(open("./neta.csv"))
    for row in reader:
        id = row[0]
        value = row[1]
        cur = c.cursor()
        t = (id,value,)
        cur.execute("insert into hash2 values(%s,%s)",t)
        i += 1
        if i % 10000 == 0:
            c.commit()
            print "commit! %d" % i
    c.commit()
    c.close()
    end = time.time()
    print end-start


本当にあってるのか自信が持てないのですが、一応上記で動作しました。
例はCSVからデータを1行ずつ読み込んで100万件Insertするというものです。
しかし、integerの行に対してInsertするとエラーとなった為、テーブルを以下のようにしてid列をTEXT型で作成しました。
create table hash2 ( id TEXT PRIMARY KEY , value TEXT );

100万行のInsertには1145sかかりました。これはSqliteやMongodbと比較するとかなり遅いです。しかし冷静になって考えると1秒で約1000件弱Insertしているので、日頃の仕事で使っているDBと比較しても大差無いのかな、というところです。

以下、補足します。
・性能があがりそうなパラメータを少し変化させたが有意な差は得られませんでした。
 (wal_buffersの値を増やす、synchronous_commitをoffにする・・・等)
・id列のPRIMERY KEYを削除してやってみましたが、やはり性能差はありませんでした。
・Python3.xにはpy-postgresqlというものがあり、ドライバの品質(ドキュメント?)的には一番良さそうな気がしました。しかし、テストアプリを作るところで挫折しました。
(Transactionの実装方式がイマイチ??です)
・DBAPI2.0ではInsertするときもCursorを使うみたいです。内部的にはPreparedStatementみたいな事もしてくれてる?かは不明です。

OSSなので当然なんですが、Pythonのドライバは有志の人が勝手に作っていて、PostgreSQLのコアメンバの人は関わっていないみたいです。コアの人たちが関わってくればもうちょい扱いやすくなるのになーと思いました。

2011年1月15日土曜日

Amazon Kindle3がWifiでつながらずに苦労する

だいぶ前の話になりますが、、、

前から欲しいなーとは思っていた、Amazon Kindle。 バージョン3となり、139ドル!と魅力的な値段に。。。 これは買いだろうと思い購入。このときは3GとかWifiとか気にもしてませんでした。

米国から届いたので早速やってみたんですが、、あれっ?、そもそも本を買ったりするのってどうやるんだろう。。。ネットワークの設定のようなものが出てくるがつながらず。。全くわからん。。。

ここで(SEなのに)3GとかWiFiの意味を初めて知る。
・3G→端末だけでインターネットに接続可能。
・Wifi→端末は無線通信の機能のみ有、ネットワークにつながっているPCやルータ?等が必要。

amazonのサイトをよく見ると、
・3G+Wifiモデル→189ドル
・Wifiモデル→139ドル
となり3GがついてるモデルはWifiのみのモデルよりも高いのです。(今考えると当たり前ですが)

本当に恥ずかしながら無線LANは本で読んだ事はあるが、使った事が無い私。そもそもプロバイダーとかと新規契約する必要あるの?とかマクドとか行かないとつながらないの?とか驚くほどしょうもない事を調べる。。どうやらインターネットに繋がるPCとかがあれば、無線LAN機器を使って接続可能なようだ。

なぜか嫁さんがUSBの無線LANアダプタを持っていたので早速使ってみる。。
だめだ、つながらん。。と来る日も来る日も(夜中に)思考錯誤するが、つながらない。。
そもそもですが、Kindleは入力装置が貧弱でスムーズに入力出来ないので色々試そうとしてもものすごーーく時間がかかってしまいます。

USB型のやつはひょっとしてKindleと相性が悪いのか・・・
という訳でUSB型じゃない無線LANの親機をK'sデンキで購入。。。
これでつながらないならもうあきらめよう・・・

すると、驚くほど簡単につながった。

やった!!!



そこで前から欲しかった英語の技術書を買う。通勤時間にKindleで英語の本を読む。
何だかインテリな気分。。。(半分程度しか理解出来ないのですが。)

1か月程度たった頃、ちょっとしたはずみでKindleに少し力をかけてしまった。そのタイミングで何か鈍い感触。

もしや・・・

という訳でいとも簡単に壊れてしまいました。(電源は入るんですが、何も見えない状態)
壊れた瞬間に私のKindle熱は一瞬で冷めてしまいました。
もう当分、電子書籍には手を出さないようにします。。


                            ↓こんな感じで。。亀裂骨折です。



<まとめ>
・Kindle3は安い。基本的には常時ネット接続するような必要性は無いのでWifiのみで良いと思う。
・Kindle3は目に優しい。普通の本を見ているようなもので、PCを見るよりも目が疲れないです。
・Wifiのみの場合、無線LANの知識が無いとかなり苦戦する。まあ安いUSBのやつでもつながるとは思うんですが、身近で無線LANを使ってない場合はそこそこの無線LAN機器を買った方が無難かも。(そんな事感じたの、私だけかな・・?)
・Kindle3は電子製品なので当然壊れる。壊れた時はショックが大きい。



↓今となってはどうでもいいんですが、K'sで買った無線LAN機器です。
 これはつながりました。