2014-09-07 12 views
5

Ho una domanda di base sull'utilizzo di FileSystem Desidero utilizzare un archivio KeyValue integrato, che è molto orientato alla scrittura. (Persistente) Dire la mia taglia valore è a) 10 K b) 1 M e leggere e gli aggiornamenti sono in numero pariInformazioni su KeyValue Datastore incorporato vs FileSystem

Cant ho semplicemente creare file che contengono il valore e non vi nomino in qualità di chiavi.

Non è veloce quanto l'utilizzo di un archivio KeyValue come LevelDB o RocksDB.

Qualcuno può aiutarmi per favore a capire.

risposta

15

In linea di principio, sì, un filesystem può essere utilizzato come archivio di valori-chiave. Le differenze si verificano solo quando si esaminano casi d'uso individuali e limitazioni nelle implementazioni.

Senza entrare troppo nei dettagli qui, ci sono alcune cose che possono essere molto diverse:

  • Un filesystem divide i dati in blocchi di dimensioni fisse. Due file normalmente non possono occupare parti dello stesso blocco. Le dimensioni dei blocchi comuni sono 4-16 KiB; puoi calcolare la quantità di sovraccarico che potrebbe causare il tuo esempio di 10 KiB. Gli archivi chiave/valore tendono a tenere conto di pezzi di dati di dimensioni più ridotte.
  • Gli indici di directory nei file system spesso non sono in grado di scorrere in modo efficiente i nomi dei file/chiavi in ​​ordine di ordinamento. Puoi cercare in modo efficiente una chiave specifica, ma non puoi recuperare intervalli senza leggere praticamente tutte le voci della directory. Alcuni negozi di chiavi/valore, incluso LevelDB, supportano un'efficiente iterazione ordinata.
  • Alcuni negozi di chiavi/valore, incluso LevelDB, sono transazionali. Ciò significa che è possibile raggruppare diversi aggiornamenti insieme e LevelDB si assicurerà che tutti o tutti questi aggiornamenti lo superino, o nessuno di essi lo faccia. Questo è molto importante per evitare che i tuoi dati diventino incoerenti. I filesystem rendono molto più difficile da implementare, specialmente quando sono coinvolti più file.
  • Gli archivi di chiavi/valori di solito cercano di mantenere i dati contigui su disco (in modo che i dati possano essere recuperati con meno ricerca), mentre i file system moderni non lo fanno deliberatamente sui file. Ciò può influire sulle prestazioni in maniera piuttosto grave durante la lettura di molti record. Non è un problema sui dischi a stato solido, però.
  • Mentre alcuni filesystem offrono funzionalità di compressione, di solito sono per file o per blocco. Per quanto posso vedere, LevelDB comprime interi blocchi di dati, producendo potenzialmente una compressione migliore (sebbene abbiano influenzato la loro strategia di compressione verso le prestazioni rispetto all'efficienza della compressione).
+0

+1 per questa risposta. I database k/v memorizzano i dati in modo più compatto e hanno un livello di memorizzazione nella cache aggiuntivo. puoi quindi aspettarti prestazioni molto più veloci (e funzionalità aggiuntive che potrebbero essere utili per la tua applicazione). Inoltre, alcuni file system non vengono scalati correttamente se si creano molti file. – cruppstahl

+1

Per completezza, su qualsiasi sistema operativo sensato, anche i dati del filesystem sono memorizzati nella cache. –

+1

Quindi puoi suggerire, se la dimensione del valore è grande (diciamo 5 MB), e il modello è look, update, store; usare un negozio kv ha senso. Inoltre, dire che creare file da 500 K avrà un impatto negativo sul filesystem –