概要
- MongoDB で大きなファイルを保存する仕組み「GridFS」を使う。
- コンソールから使用。
- Python のモジュール「pymongo」から使用。
GridFS って…?
- gihyo.jp の記事 が分かりやすかった。
- 通常、MongoDB に保存できるドキュメントのサイズは 16MB が上限。
- このサイズを超えるデータを取り扱いたいときに GridFS を使う。
- GridFS は MongoDB (に / から) データを分割して (入力 / 出力) するためのインタフェース。
コマンドラインから使用。
- MongoDB の標準コマンド「mongofiles」を使用する。
- 猫写真「neko.jpg」を 保存・取り出し・検索・削除 してみる。
( put )
$ mongofiles -v -d images put neko.jpg
( get )
$ mkdir tmp
$ cd tmp
$ mongofiles -v -d images get neko.jpg
( search )
$ mongofiles -v -d images search ek
( delete )
$ mongofiles -v -d images delete neko.jpg
( search 消えたことを確認)
$ mongofiles -v -d images search ek
- ※ MongoDB への path は既に通っていること前提。前記事参照。
- option
- 「-v」= 「--verbose」は冗長化
- 「-d」で DB 指定。
Python から使用 ( pymongo )
- gridfs モジュールを import して使用できる。
- ファイルの読み込みは Python のファイル操作で行う。
- 画像は binary read / write して、gridfs モジュールに書き込み。
- 以下、サンプル。
- src_filename にある画像を images DB に保存。
- tmp2 ディレクトリを作成し、images DB から取った画像を dest_filename として保存。
import gridfs
from pymongo import MongoClient
import os
src_filename = "neko.jpg"
dest_filename = "neko2.jpg"
client = MongoClient()
db = client['images']
fs = gridfs.GridFS( db )
dir_name = './tmp2'
if not os.path.exists( dir_name ) :
os.mkdir( dir_name )
f = open( src_filename, "rb" )
image = fs.put( f.read() )
f.close()
file_path = "{0}/{1}".format( dir_name, dest_filename )
f = open( file_path, "wb" )
f.write( fs.get( image ).read() )
f.close()