Я работаю над приложением, которое должно хранить метаданные, связанные с музыкальными файлами (художник, название, счетчик пьес и т. Д.), А также наборы целых чисел (в частности, хэши 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) сохранение всех моих данных в ОЗУ было бы менее идеальным.
Есть ли какие-либо другие решения для этого типа проблем или это одно из решений, которые я уже перечислил намного лучше, чем другие?
* Сериализация транзакций на основе Mutex в Akonadi (требуется потому, что поддержка параллелизма SQlite может оказаться недостаточной) может блокировать клиентов, в то время как фоновые операции, такие как синхронизация IMAP, продолжаются. Почему * heck * люди делают IMAP-синхронизацию (независимо от того, что это означает), имея блокировку в своей базе данных и вызывающую * проблему SQLite *? –
Вы знаете, тесты на сайте SQlite, похоже, полностью противоречат тому, что KDE сказал об этом, и Аконади, будучи ужасным, меня не удивит. Возможно, SQlite действительно заслуживает большего изучения. – CmdrMoozy
SQlite используется повсюду от вашего браузера до производственных серверов, которые могут обслуживать тысячи пользователей (были там, сделали это, получили футболку). Это не проблема производительности. –