プロジェクト専用のMongoDB環境をUbuntu 20.04で構築する
目次
背景
- 顔認識システムで、URL、512次元の数値配列、検索結果などを効率よく保存・検索したい。
- MongoDBの高度なインデックス作成機能がこの用途に適している。
- Ubuntu 20.04を使用しており、システム全体に影響を与えずにMongoDBを導入したい。
解決策
Dockerを使用して、プロジェクト専用のMongoDB環境を構築する。
手順
1. Dockerのインストール
Ubuntu 20.04にDockerをインストールする。
Dockerがインストールされているか確認
docker --version
sudo systemctl status docker
インストールされていなければ、以下のURLを参照してインストールする。
Install Docker Desktop on Ubuntu
2. MongoDBのDockerコンテナーを起動
専用のディレクトリ(例:/home/user/bin/mongodb
)でMongoDBのDockerコンテナーを起動する。
docker run --name my-mongodb -v /home/user/bin/mongodb/data:/data/db -p 27017:27017 -d mongo
3. Python仮想環境の作成
同じディレクトリ内でPythonの仮想環境を作成する。
python3 -m venv .
4. 仮想環境をアクティブにする
source ./bin/activate
5. MongoDBのPythonドライバーをインストール
pip install pymongo
FaissとMongoDBを組み合わせたダミーデータの検索
必要なパッケージのインストール
pip install pymongo
pip install faiss-cpu # CPU版
コード例
- MongoDBに接続し、ダミーデータを挿入。
- Faissのインデックスを作成し、ダミーデータを追加。
- テキストファイル(ここではランダムに生成)からクエリベクトルを読み込み、Faissで検索。
- 検索結果に一致したURLを標準出力。
from pymongo import MongoClient
import numpy as np
import faiss
# MongoDBに接続
client = MongoClient('localhost', 27017)
db = client['my_database']
collection = db['my_collection']
# ダミーデータを作成
companies = ['yahoo', 'google', 'microsoft', 'apple', 'amazon']
dummy_data = []
for company in companies:
vec = np.random.rand(512).astype('float32') # 512次元のベクトル
url = f"{company}.co.jp"
dummy_data.append({'company': company, 'vector': vec.tolist(), 'url': url})
# MongoDBにダミーデータを挿入
collection.insert_many(dummy_data)
# Faissのインデックスを作成
vectors = np.array([d['vector'] for d in dummy_data]).astype('float32')
index = faiss.IndexFlatL2(512)
index.add(vectors)
# テキストファイルからクエリベクトルを読み込む(ここではランダムに生成)
query_vector = np.random.rand(1, 512).astype('float32')
# Faissで検索
k = 1 # 近傍点数
D, I = index.search(query_vector, k)
# 検索結果を出力
for i in I[0]:
doc = collection.find_one({'company': companies[i]})
print(f"検索に一致したURL: {doc['url']}")
print("Faissでの検索と結果の出力が完了しました。")
出力例
検索に一致したURL: amazon.co.jp
Faissでの検索と結果の出力が完了しました。
起動しているMongoDBコンテナーを停止する
- コンテナーのIDまたは名前を確認する:
docker ps
コマンドを使用して、現在実行中のコンテナーの一覧を表示します。docker ps
このコマンドの出力から、MongoDBコンテナーのIDまたは名前を確認できます。 - コンテナーを停止する:
docker stop
コマンドに、停止したいコンテナーのIDまたは名前を指定します。bash docker stop [CONTAINER_ID_OR_NAME]
例えば、コンテナーのIDが1234567890ab
の場合、以下のように実行します。bash docker stop 1234567890ab
例
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d4d93372ebcb mongo "docker-entrypoint.s…" About an hour ago Up About an hour 0.0.0.0:27017->27017/tcp, :::27017->27017/tcp my-mongodb
$ docker stop my-mongodb
my-mongodb
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
これで、MongoDBのDockerコンテナーが停止します。
まとめ
- Dockerを使用することで、システム全体に影響を与えずにMongoDBを導入できる。
- Pythonの仮想環境内でMongoDBのPythonドライバー(PyMongo)をインストールすることで、プロジェクト専用の環境を構築できる。
- FaissとMongoDBを組み合わせることで、高次元のベクトルデータに対する効率的な検索と保存が可能。
以上です。ありがとうございました。