多数の画像(数百万)と、比較する必要のあるそれらの画像(libpuzzleによって生成された)のコンテンツ署名で構成されるデータベースがあります。
さまざまな検索アルゴリズム(現在、レーベンシュタインの差が最も速く実行されている)やプレフィルターとしてのさまざまなデータポイント(比較をわずか数千のバッチに削減する)など、さまざまな代替案を実行して効率を高めています。画像)しかし、私が試したものはすべて、本番環境での使用を遅らせる方法です。私は1日に数千枚の画像を追加します。これらの画像には、完全なコレクションの他のすべての画像と比較して署名が必要です。
私が使用した2つの主なストレージ方法は、CouchDbとMySqlです。どちらも、数十ギガ以上のデータストレージが必要であり、わずか数百万のレコードの後、MySqlの実行が非常に遅くなります(結果のキャッシュとインデックスのキーサイズの変動があっても、インデックスこれと同様のアプローチを使用すると大きすぎますが、これは優れていますが、それでも低速です)。Couchでは、大きなインデックスを処理できないようです。また、ストレージの問題を解決するAmazon SimpleDBのようなサービスも検討しましたが、このような大きなインデックスのメモリ要件を考えると非常に高価であり、Couchよりもうまくいかない可能性があります。
テーブルの構造は単純です。
ImageId int(11),
Signature VARCHAR(1020) //implemented as text
望ましい結果は、ImageIdが指定されたImageIdのリストである必要があります。単純な自己結合(ON比較機能)は遅すぎます。
私の実装は、既存の画像を比較し、継続的に新しい画像を既存のベースと比較して、これら2つの目標を達成することです... 1)同一またはほぼ同一の画像(サイズ変更、トリミング、マイナーなカラーバリエーションを含む)を特定します。 2)類似した画像を特定して、類似した視覚的コンテンツの画像に関心がある可能性のある画像検索を支援します。libpuzzleライブラリは、両方に使用できるスコアを提供します(前者には> 95%、後者には> 80%を使用します)。
本質的に私の質問は、 a)
異なるデータストレージプラットフォーム
b)MySqlを使用する技術c)または
非常に大量のバイナリデータを線形に比較するために使用できる
他の(おそらくカスタム)アプローチのいずれかを知っている人はいますか?
効率的な方法?