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"
}
ちゃんと登録できたみたいです。
- 関連記事
-
- MongoDBに登録した住所を検索する
- MongoDBにインデックスを作成する
- MongoDBに一括でデータを登録する(Bulk Inserts)
- MongoDBをPythonで操作する(PyMongo使用)
- MongoDBのHttp Interface
コメント