Domanda

La domanda: Quale soluzione o suggerimenti si dovrebbe avere a che fare con un database molto grande (multi-terabyte) indicizzati su forti hash ad elevata ridondanza?

Una specie di stoccaggio invertita?

C'è qualcosa che potrebbe essere fatto con Postgres?

Sono pronto a rotolare il mio stoccaggio, se necessario.

(Suggerimento: Deve essere open source, senza Java, deve essere eseguito su Linux, deve essere basato su disco, C / C ++ / Python preferito)

I dettagli:

ho bisogno di creare un database molto grande in cui ogni record è:

  • alcuni meta-dati arbitrari (una parte di testo campi) tra cui alcuni della chiave primaria
  • una hash (128 bit hash MD5, come forte)

Il volume di record è quello che vorrei qualificarsi come abbastanza grande: diversi da 10 a 100 miliardi di). C'è una ridondanza significativa di hash attraverso le righe (oltre il 40% dei record hanno il loro hash condiviso con almeno un altro record, alcuni esistono hash in 100K record)

L'utilizzo primario è di ricercare da cancelletto, quindi recuperare i metadati. L'utilizzo secondario è di ricercare per chiave primaria, quindi recuperare i metadati.

Si tratta di una base di dati di analisi di tipo, in modo che il carico complessivo è di media, per lo più leggere, poche scrive, scrive lo più batch.

L'approccio attuale è quello di utilizzare Postgres, con un indice sulla chiave primaria e di un indice sulla colonna di hash. La tabella viene caricata in batch con l'indice nella hash spenta.

Tutti gli indici sono Usa Btree. L'indice sulla colonna di hash è in crescita enorme, come grandi o più grande della tabella stessa. Su un tavolo da 120 GB ci vuole circa un giorno per ricreare l'indice. Le prestazioni di query sono abbastanza buona.

Il problema è che la dimensione pianificata per il database di destinazione sarà oltre 4 TB per esami con un insieme di dati più piccolo di 400 GB che rappresenta circa il 10% del totale bersaglio. Una volta caricata in Postgres, più del 50% della memoria viene purtroppo utilizzata dall'indice SQL sulla colonna hash.

Questo è troppo grande. E sento che la ridondanza di hash è un'opportunità per la memorizzazione di meno.

Si noti inoltre che mentre questo descrive il problema, ci sono alcune di queste tabelle che deve essere creato.

È stato utile?

Soluzione

Si potrebbe creare una tabella con solo id e Hash, e il vostro altri dati con l'indice, metadati, e Hashid. In questo modo, è possibile impedire a scrivere lo stesso hash fino a 100k volte nella tabella.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top