Suggerimenti/opinioni per l'implementazione di un modo rapido ed efficiente per cercare un elenco di elementi in un set di dati molto grande

StackOverflow https://stackoverflow.com/questions/9398951

  •  29-10-2019
  •  | 
  •  

Domanda

Si prega di commentare e criticare l'approccio.

Scenario: Ho un set di dati di grandi dimensioni (200 milioni di voci) in un file piatto. I dati sono del modulo: un numero di telefono a 10 cifre seguito da 5-6 campi binari. Ogni settimana riceverò un file Delta che conterrà solo modifiche ai dati.

Problema : Dato un elenco di elementi che devo capire se ogni elemento (che sarà il numero di 10 cifre) è presente nel set di dati.

L'approccio che ho pianificato :

  • Analizzerà il set di dati e lo metterà un DB (da fare all'inizio della settimana) come MySQL o Postgres. Il motivo per cui voglio avere RDBMS nel primo passo è che voglio avere dati sulle serie a tempo pieno.

  • Quindi genera una sorta di archivio di valori chiave da questo database con gli ultimi dati validi che supportano l'operazione per scoprire se ogni elemento è presente nel set di dati o meno (pensando a una sorta di DB NoSQL, come Redis qui ottimizzato per la ricerca. avere persistenza e essere distribuito). Questa datatastruttura sarà di sola lettura.

  • Interroga questo negozio di valori chiave per scoprire se ogni elemento è presente (se possibile corrispondere a un elenco di valori tutti in una volta invece di abbinare un elemento alla volta). Voglio che questo sia ardente velocemente. Utilizzerà questa funzionalità come back-end per un'API REST

Nota a margine: La lingua della mia preferenza è Python.

È stato utile?

Soluzione

Alcune considerazioni per la ricerca veloce:

  • Se vuoi controllare un set di numeri alla volta, potresti usare Redis SINTER che esegue l'intersezione set.
  • Potresti trarre vantaggio dall'uso di una struttura a griglia distribuendo intervalli di numeri su alcune funzioni di hash come la prima cifra del numero di telefono (probabilmente ce ne sono di quelli migliori, devi sperimentare), ciò ridurrebbe le dimensioni per nodo, quando si utilizza un hash ottimale, a quasi 20 milioni di voci quando si utilizza 10 nodi.
  • Se ti aspetti richieste duplicate, il che è abbastanza probabile, è possibile memorizzare nella cache gli ultimi numeri di telefono richiesti in un set più piccolo e interrogare prima.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top