MongoDBに一括でデータを登録する(Bulk Inserts)

CouchDBには、大量のデータを登録する場合用にBulk Insertの機能がありました。
MongoDBで同様の機能を実装する方法を調べたのでメモ。



MongoDBのBulk Insert



やり方はいたって簡単で、insertの引数にオブジェクトのリストを
渡してやればOK

以下、サンプルです。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

from pymongo import Connection
from pymongo.objectid import ObjectId

#コネクション作成
con = Connection('192.168.1.245', 27017)

#コネクションからtestデータベースを取得
db = con.test

#testデータベースからfooコレクションを取得
col = db.foo


#bulk insert用のデータを準備
bulk = []

bulk.append({u'a' : 1})
bulk.append({u'b' : 2})
bulk.append({u'c' : 3})
bulk.append({u'd' : 4})
bulk.append({u'e' : 5})
bulk.append({u'f' : 6})
bulk.append({u'g' : 7})
bulk.append({u'h' : 8})
bulk.append({u'i' : 9})
bulk.append({u'j' : 10})

#一括登録
col.insert(bulk)


for data in col.find():
    print data

con.disconnect()




bulkというリストに{'a':1}から{'j':10}までの値を
設定しています。
それをまとめてcol.insert(bulk)としてやれば一括で登録されます。

以下、実行結果。


c:\>python sample.py
{u'a': 1, u'_id': ObjectId('4b3f5bbd5179570b7c000000')}
{u'_id': ObjectId('4b3f5bbd5179570b7c000001'), u'b': 2}
{u'c': 3, u'_id': ObjectId('4b3f5bbd5179570b7c000002')}
{u'_id': ObjectId('4b3f5bbd5179570b7c000003'), u'd': 4}
{u'_id': ObjectId('4b3f5bbd5179570b7c000004'), u'e': 5}
{u'_id': ObjectId('4b3f5bbd5179570b7c000005'), u'f': 6}
{u'_id': ObjectId('4b3f5bbd5179570b7c000006'), u'g': 7}
{u'h': 8, u'_id': ObjectId('4b3f5bbd5179570b7c000007')}
{u'i': 9, u'_id': ObjectId('4b3f5bbd5179570b7c000008')}
{u'_id': ObjectId('4b3f5bbd5179570b7c000009'), u'j': 10}





郵便番号のBulk Insert



試しに郵便番号のデータを登録してみます。
いつもと同じく、郵便番号のデータは以下のURLからお借りしました。

http://www.post.japanpost.jp/zipcode/dl/kogaki.html


サンプルはこんな感じ。


#!/usr/bin/env python
# -*- coding:utf-8 -*-

import codecs
from pymongo import Connection
from pymongo.objectid import ObjectId

f = codecs.open('KEN_ALL.CSV', 'r', 'shift-jis')
count = 0


#コネクション作成
con = Connection('192.168.1.245', 27017)

#コネクションからtestデータベースを取得
db = con.test

#testデータベースからyubinコレクションを取得
col = db.yubin

bulk = []

for line in f:
    tmp = line.split(',')
    
    zip_code = tmp[2][1:-1]
    address = tmp[6][1:-1] + tmp[7][1:-1] + tmp[8][1:-1]
    
    bulk.append({'zip_code': zip_code, 'address' : address})
    
    count += 1
    
    if 10000 < count:
        print 'bulk insert!'
        #一括登録
        col.insert(bulk)
        bulk = []
        count = 0

if len(bulk) != 0:
    col.insert(bulk)

f.close()

con.disconnect()




実行してみると、10秒程度で登録が完了しました。
速い・・・


クライアントツールでデータ件数と内容を確認してみます。



> db.yubin.count()
122883
> db.yubin.findOne()
{
        "_id" : ObjectId("4b3f5f8351795708500018eb"),
        "address" : "北海道勇払郡厚真町高丘",
        "zip_code" : "0591615"
}



ちゃんと登録できたみたいです。


関連記事

コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
https://symfo.web.fc2.com/

PR

検索フォーム

月別アーカイブ