2013-07-03 14 views
7

音楽ファイル(アーティスト、タイトル、再生回数など)に関連付けられたメタデータと、整数セット(特にSHA-1ハッシュ)を格納する必要があるアプリケーションに取り組んでいます。私はニーズを選ぶ高速埋め込みデータベース

ソリューション:

  • は「速い」ストレージ&検索(曲の潜在的に何千ものリストを表示しているとき、私は多かれ少なかれ対話形式でメタデータを取得できるようにする必要があります)を提供します。
  • クロスプラットフォーム(Linux、Windows、OSX)です。
  • 私はC++と対話できるインターフェースを提供しています。
  • オープンソース(少なくとも、ビールのように自由にしてください)。
  • 解決策がこれを提供しないが、バイナリデータを格納できるならば、私は"Fast Set Operations Using Treaps"のようなテクニックを使って自分自身を実装することができます。
  • つまり、私がfork別のプロセスを使わなくても動作していても、少なくとも(libmysqldのように)簡単なインターフェースを提供していても動作します。私が検討している

ソリューションが含まれます:

  • フラットファイルを。これは非常に簡単ですが、フラットなデータストレージ以外の機能は提供していません。
  • SQlite。これは非常に普及しているオプションのようですが、パフォーマンスと並行性に関するいくつかの問題があるようです(いくつかの例題についてはKDE's Akonadiを参照してください)。
  • 組み込みMySQL/MariaDB。これは合理的な選択肢だと思われますが、私は複雑なSQL機能をたくさん必要としないので、少し重いかもしれません。

私が想像している仮想ソリューションは、Redisのようなものですが、データをディスクに保存し、データの一部のみをメモリに保存して検索を高速化します。 1)私は手動でforkにする必要があり、2)そのWindowsポートは堅固ではないように思えるし、3)をすべてRAM内ののすべてを理想よりも少なく保存するため、Redis自体は良い選択肢ではないかもしれない。

このタイプの問題には他に解決策がありますか、既に私が他のものよりもはるかに優れているソリューションの1つですか?

+2

* AkonadiでのMutexベースのトランザクションのシリアル化(SQliteの並行処理のサポートでは不十分かもしれません)は、IMAP同期などのバックグラウンド操作が行われている間にクライアントをブロックする可能性があります。なぜデータベースがロックされている間にIMAPの同期を行っているのか(それは何でも)、* SQLiteの問題*を呼び出すのはなぜですか? –

+0

SQliteのサイトのベンチマークは、KDEが言っていることと全く矛盾しているようです。Akonadiは恐ろしいほど私を驚かないでしょう。おそらく、SQliteは実際より多くの調査に値するでしょう。 – CmdrMoozy

+3

SQliteは、ブラウザから何千ものユーザを扱うことができるプロダクションサーバ(そこにいて、Tシャツを手に入れたことがあります)までどこでも使用されています。パフォーマンスの問題ではありません。 –

答えて

4

最後に、私はメタデータにSQliteを使用することに決めました。それは早くなくても早いと思われます。 libmysqld、そしてそれは本当にシンプルなクリーンなCインタフェースを持っています。ベンチマークによれば、それは私のニーズに合うほど速い以上のものでなければなりません。

大きなデータ構造の場合、別々のバイナリファイルに格納するだけです(SQliteのWebサイトではバイナリデータを格納できると言われていますが、データサイズが一定量を超えた場合は、代わりにファイル - this pageを参照してください)。

2

象のサイズのデータ​​ベースを必要としない限り、SQLite内にバイナリファイルのBLOBSを保存しないでください。パス・ファイル名の文字列をファイル・システムに保管するだけです。 SQLiteの唯一の欠点は、リモート(Web)アクセスを許可しないことですが、小さなTCP/HTTPサーバーに埋め込むことができます。

+0

これは、JSON配列でエンコードされたSQLクエリを受け取り、SQLiteを呼び出すことができる小さなTCPサーバーの例です。 https://github.com/pedro-vicente/lib_netsockets/blob/master/examples/sqlite_server.cc –

関連する問題