2013-07-03 11 views
7

Sto lavorando a un'applicazione che dovrà memorizzare i metadati associati ai file musicali (artista, titolo, numero di riproduzioni, ecc.), Nonché insiemi di numeri interi (in particolare gli hash SHA-1).Database incorporato veloce

La soluzione prendo bisogno di:

  • Fornire "veloce" di stoccaggio & recupero (quando si visualizza un elenco di potenzialmente migliaia di canzoni ho bisogno di essere in grado di recuperare i metadati più o meno in modo interattivo).
  • Essere multipiattaforma (su Linux, Windows e OSX).
  • Fornire un'interfaccia con cui posso interagire da C++.
  • Essere open-source (o, per lo meno, essere libero come nella birra).
  • Fornisce operazioni di set rapido (unione, intersezione, differenza) - se la soluzione non fornisce questo, ma mi consentirà di memorizzare dati binari, potrei implementarlo io stesso utilizzando una tecnica come "Fast Set Operations Using Treaps".
  • Essere "incorporato" - ovvero, operare senza che io debba effettuare il fork un altro processo, o almeno fornire un'interfaccia semplice per farlo (come libmysqld).

Solutions ho presi in considerazione comprendono:

  • Lime piatte. Questo è estremamente semplice, ma non fornisce alcuna funzionalità oltre alla memorizzazione di dati flat.
  • SQlite. Questa sembra essere un'opzione molto popolare, ma sembra avere alcuni problemi relativi alle prestazioni e alla concorrenza (vedere KDE's Akonadi, per alcuni problemi di esempio).
  • MySQL/MariaDB incorporato. Questa sembra essere un'opzione ragionevole, ma potrebbe anche essere un po 'pesante considerando che non avrò bisogno di molte complicate funzionalità SQL.

Una soluzione ipotetica che penso sarebbe perfetta sarebbe qualcosa come Redis, ma che persiste i dati sul disco e memorizza solo una parte dei dati in memoria per rendere veloce il recupero. Redis potrebbe non essere una buona opzione perché 1) Avrei bisogno di fork manualmente, 2) la sua porta di Windows sembra meno solida e 3) la memorizzazione di tutti i dei miei dati nella RAM sarebbe meno ideale.

Esistono altre soluzioni per questo tipo di problema oppure è una delle soluzioni che ho già elencato meglio rispetto alle altre?

+2

* La serializzazione della transazione basata su mutex in Akonadi (richiesta perché il supporto di SQlite della concorrenza potrebbe non essere sufficiente) può bloccare i client mentre le operazioni in background come la sincronizzazione IMAP sono in corso. * Huh? Perché * heck * sono persone che eseguono la sincronizzazione IMAP (qualunque cosa significhi) mentre hanno un blocco sul loro database e chiamano in * un problema SQLite *? –

+0

Sai, i benchmark sul sito di SQlite sembrano contraddire totalmente quello che KDE ha detto a riguardo, e il fatto che Akonadi sia terribile non mi sorprende del tutto. Forse SQlite merita sicuramente ulteriori indagini. – CmdrMoozy

+3

SQlite è utilizzato ovunque dal tuo browser ai server di produzione in grado di gestire migliaia di utenti (è stato lì, fatto quello, ha ottenuto la maglietta). Non è un problema di prestazioni. –

risposta

4

Alla fine, ho deciso di utilizzare SQlite per i metadati. Sembra essere altrettanto veloce se non più veloce di ad es. libmysqld e ha un'interfaccia C pulita davvero semplice. Secondo i benchmark, dovrebbe essere molto più che abbastanza veloce per soddisfare le mie esigenze.

Per le strutture di dati più grandi, sto pianificando di archiviarle in file binari separati (il sito Web SQlite afferma che è possibile memorizzare dati binari, ma che se le dimensioni dei dati superano una certa quantità è più veloce memorizzarle in flat file invece - vedi this page).

2

Non archiviare file binari BLOB in SQLite, a meno che non si desideri un database delle dimensioni dell'elefante. Basta memorizzare una stringa con il nome del file di percorso sul file system. L'unico lato negativo di SQLite è che non consente l'accesso remoto (web), ma è possibile incorporarlo in un piccolo server TCP/HTTP.

+0

questo è un esempio di un piccolo server TCP in grado di ricevere query SQL codificate in un array JSON ed effettuare chiamate a SQLite. https://github.com/pedro-vicente/lib_netsockets/blob/master/examples/sqlite_server.cc –