雑食性雑感雑記

知識の整理場。ため込んだ知識をブログ記事として再構築します。

MongoDB の GridFS を使ってみる。

概要

  • MongoDB で大きなファイルを保存する仕組み「GridFS」を使う。
    • コンソールから使用。
    • Python のモジュール「pymongo」から使用。

GridFS って…?

  • gihyo.jp の記事 が分かりやすかった。
    • 通常、MongoDB に保存できるドキュメントのサイズは 16MB が上限。
    • このサイズを超えるデータを取り扱いたいときに GridFS を使う。
    • GridFS は MongoDB (に / から) データを分割して (入力 / 出力) するためのインタフェース。

コマンドラインから使用。

  • MongoDB の標準コマンド「mongofiles」を使用する。
    • put
    • get
    • search
    • delete
  • 猫写真「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 指定。
  • search
    • 指定した文字列が含まれているファイル名を表示。
  • delete
    • 同じファイル名のデータが全て削除される。

Python から使用 ( pymongo )

  • gridfs モジュールを import して使用できる。
    • ファイルの読み込みは Python のファイル操作で行う。
    • 画像は binary read / write して、gridfs モジュールに書き込み。
  • 以下、サンプル。
    • src_filename にある画像を images DB に保存。
    • tmp2 ディレクトリを作成し、images DB から取った画像を dest_filename として保存。
# -*- coding: utf-8 -*-
import gridfs
from pymongo import MongoClient

import os

src_filename  = "neko.jpg"
dest_filename = "neko2.jpg"

# Connect Mongo
client = MongoClient()
db     = client['images']

# Connect gridfs
fs = gridfs.GridFS( db )

# Create tmp2 directory
dir_name = './tmp2'
if not os.path.exists( dir_name ) :
    os.mkdir( dir_name )

# Put image
f = open( src_filename, "rb" )
image = fs.put( f.read() )
f.close()

# Get image
file_path = "{0}/{1}".format( dir_name, dest_filename )
f = open( file_path, "wb" )
f.write( fs.get( image ).read() )
f.close()