Come funziona I / O per database di grandi dimensioni?

4

Dovrei dare una premessa dicendo che sono principalmente uno sviluppatore web di front end, formato come musicista, ma negli ultimi anni ho sempre più sviluppato l'informatica.

Quindi un'idea che ho come divertente progetto di giocattolo per conoscere le strutture dati e la programmazione C è stata quella di progettare e implementare il mio database molto semplice che gestiva un elenco di post di adiacenze. Non voglio SQL (forse farò il mio linguaggio di query? Mi sto solo divertendo). Dovrebbe supportare l'ACID. Dovrebbe essere in grado di memorizzare 1 TB, diciamo.

Quindi, stavo cercando di pensare a come un database memorizza i dati, senza riguardo alle strutture dati necessariamente. Sto lavorando su linux e ho letto che in quel mondo "tutto è un file", incluso l'hardware (come /dev/* ), quindi penso che ovviamente debba applicarsi anche a un database, e chiaramente fa - sia che sia MySQL o PostgreSQL o Neo4j, il database stesso è una raccolta di file che puoi vedere nel filesystem.

Detto questo, ci sarebbe un punto in scala in cui il caricamento dell'intero database nella memoria primaria non funzionerebbe, quindi non ha senso progettarlo con quella mentalità (presumo). Tuttavia, la lettura dalla memoria secondaria sarebbe molto più lenta e indipendentemente da una parte del database deve essere nella memoria primaria per poter essere in grado di fare qualsiasi cosa con esso. Ho letto questo post:

Perché utilizzare un database invece di salvare i dati sul disco?

E ho trovato difficile capire come altri database, come SQLite o Neo4j, leggono e scrivono dalla memoria secondaria e sono ancora molto veloci (più veloce, sembrerebbe, piuttosto che scrivere semplicemente file sul filesystem come suggerisce la domanda precedente) . Sembra che la chiave sia l'indicizzazione. Ma anche gli indici devono essere memorizzati nella memoria secondaria. Sono intrinsecamente più piccoli del database stesso, ma anche gli indici di un database molto grande potrebbero essere troppo grandi.

Quindi la mia domanda è: in che modo l'I / O viene generalmente eseguito con database di grandi dimensioni come quello che ho descritto in precedenza, che sarebbe almeno di 1 TB contenente una grande lista di adiacenze? Se l'indicizzazione è più o meno la risposta, come funziona esattamente l'indicizzazione: quali strutture di dati dovrebbero essere coinvolte?

    
posta tjb1982 10.05.2014 - 16:27
fonte

2 risposte

2

Penso che il termine che stai cercando sia File mappato in memoria . Gli sviluppatori Neo4j occasionalmente blog su Neo4j interno, il post Neo4j Internals: Persistenza e mappatura della memoria dovrebbe essere di interesse. Non ho letto me stesso però e non sono sicuro di quanto sia attuale w.r.t. all'implementazione di Neo4j (post è del 2010), ma potrebbe essere un punto di partenza.

    
risposta data 02.07.2015 - 14:12
fonte
0

Questo è difficile ...

La lettura di un blocco dal disco richiede molto tempo, anche se su un SSD la lettura di un blocco richiede tempo. Tuttavia un blocco può contenere molti oggetti e collegamenti ad altri oggetti. Quindi vuoi mettere oggetti che tendono ad accedere allo stesso tempo sullo stesso blocco disco / ssd.

Molto tempo fa ho lavorato su un sistema utilizzato per la produzione di mappe, che memorizzava strade, case ecc. come oggetto con collegamenti tra di loro. Abbiamo creato il nostro ID oggetto utilizzando il prefisso basato sulla posizione grafica dell'oggetto (utilizzando un codice grigio) e quindi memorizzato in un albero B +.

(Un normale database sarà costituito da tutte le case in una tabella, tutte le strade in una tabella di altre, ecc. Quindi cercherà di mettere ciascuna tabella su una diversa sezione di disco.)

    
risposta data 10.05.2014 - 19:55
fonte