2013-07-03 10 views
7

Я работаю над приложением, которое должно хранить метаданные, связанные с музыкальными файлами (художник, название, счетчик пьес и т. Д.), А также наборы целых чисел (в частности, хэши SHA-1).Быстрая встроенная база данных

Решение Я собираю потребности в:

  • Предоставлять «быстрой» памяти & поиска (при просмотре списка потенциально тысяч песен мне нужно, чтобы иметь возможность получить метаданные более или менее в интерактивном режиме).
  • Будьте кросс-платформенными (для Linux, Windows и OSX).
  • Предоставьте интерфейс, с которым я могу взаимодействовать с C++.
  • Будьте свободным (или, по крайней мере, свободны, как в пиве).
  • Обеспечение операций быстрого набора (объединение, пересечение, разность) - если это решение не предоставляет, но это позволит мне хранить двоичные данные, я мог бы реализовать это самостоятельно, используя технику, например "Fast Set Operations Using Treaps".
  • Быть «внедренным», то есть работать без меня, чтобы fork еще один процесс, или, по крайней мере, обеспечить легкий интерфейс для этого (например, libmysqld).

Solutions Я Рассмотренные включают в себя:

  • Плоские файлы. Это чрезвычайно просто, но не предоставляет никаких функций, кроме плоского хранения данных.
  • SQlite. Это, кажется, очень популярный вариант, но, похоже, некоторые проблемы, связанные с производительностью и параллелизмом (см. KDE's Akonadi, для некоторых примеров).
  • Встроенный MySQL/MariaDB. Кажется, это разумный вариант, но он также может быть немного тяжеловесным, учитывая, что мне не понадобятся многие сложные функции SQL.

Гипотетическое решение, которое я считаю идеальным, было бы чем-то вроде Redis, но которое сохраняет данные на диске и хранит только часть данных в памяти, чтобы быстро восстановить. Redis сам по себе не может быть хорошим вариантом, потому что 1) мне нужно будет fork его вручную, 2) его порт для Windows кажется менее твердым, и 3) сохранение всех моих данных в ОЗУ было бы менее идеальным.

Есть ли какие-либо другие решения для этого типа проблем или это одно из решений, которые я уже перечислил намного лучше, чем другие?

+2

* Сериализация транзакций на основе Mutex в Akonadi (требуется потому, что поддержка параллелизма SQlite может оказаться недостаточной) может блокировать клиентов, в то время как фоновые операции, такие как синхронизация IMAP, продолжаются. Почему * heck * люди делают IMAP-синхронизацию (независимо от того, что это означает), имея блокировку в своей базе данных и вызывающую * проблему SQLite *? –

+0

Вы знаете, тесты на сайте SQlite, похоже, полностью противоречат тому, что KDE сказал об этом, и Аконади, будучи ужасным, меня не удивит. Возможно, SQlite действительно заслуживает большего изучения. – CmdrMoozy

+3

SQlite используется повсюду от вашего браузера до производственных серверов, которые могут обслуживать тысячи пользователей (были там, сделали это, получили футболку). Это не проблема производительности. –

ответ

4

В конце концов, я решил использовать SQlite для метаданных. Кажется, что это так быстро, если не быстрее, чем, например, libmysqld, и у него действительно простой чистый C-интерфейс. Согласно эталонам, он должен быть более чем достаточно быстрым, чтобы удовлетворить мои потребности.

Для больших структур данных я планирую только их хранить в отдельных двоичных файлах (на веб-сайте SQlite говорится, что он может хранить двоичные данные, но если размер данных превышает определенную сумму, то быстрее хранить его в плоском файлы - см. this page).

2

Не храните двоичные файлы BLOBS внутри SQLite, если вы не хотите базы данных слонов. Просто сохраните строку с именем файла пути в файловой системе. Единственным недостатком SQLite является то, что он не позволяет удаленному (сетевому) доступу, но вы можете встроить его в небольшой TCP/HTTP-сервер.

+0

это пример небольшого TCP-сервера, который может получать SQL-запросы, закодированные в массиве JSON, и делать вызовы SQLite. https://github.com/pedro-vicente/lib_netsockets/blob/master/examples/sqlite_server.cc –

Смежные вопросы