Быстрая встроенная база данных

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

Решение, которое я выбираю, должно:

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

Решения, которые я рассмотрел, включают:

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

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

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

8

Решение

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

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

4

Другие решения

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

3

По вопросам рекламы [email protected]