Eviterei di caricare tutti i 2,1 milioni di righe in memoria (almeno, non sarebbe la mia prima scelta farlo). Anche se è possibile farlo con una query, e anche se si risolvono i problemi di memoria, ci vorrà ancora del tempo per ottenere tutti quei dati sul client. Le ricerche in questi dati potrebbero essere probabilmente più veloci di molte query SQL sulla rete, ma se ciò paga in realtà in confronto al caricamento iniziale è discutibile (ovviamente, dovrai misurarlo per essere sicuro).
Se ti ho capito bene, non hai bisogno di tutti quei dati per eseguire la convalida - hai bisogno solo di dati per ~ 10.000 indirizzi e un numero di record dal database di dimensioni comparabili. Probabilmente proverei a ridurre il numero di query per ottenere esattamente quei dati. Forse non hai bisogno di 20 query per indirizzo e puoi ridurlo a 10? Questo sarebbe un inizio. Forse puoi ottenere i dati per più indirizzi in una query anziché in molti, utilizzando gli operatori IN
o OR
nelle clausole WHERE
delle tue istruzioni? Probabilmente questo sarebbe d'aiuto, dato che per una piccola quantità di dati, spesso il numero di query è il fattore chiave, non se ottieni 10, 100 o 1000 byte di risultati.
Se desideri consigli più specifici, devi fornire maggiori dettagli sul modello di dati e sulle query che stai utilizzando.
EDIT: si presume che il proprio database degli indirizzi sia stato congelato per diversi mesi, il che equivarrebbe a utilizzare una copia locale dell'intero database come cache. Qualcosa come SqlLite dovrebbe essere la scelta logica qui: un database molto veloce, senza server, in-process (e facoltativamente in memoria), in cui tutti i dati possono essere archiviati in un unico file. Puoi ancora usare SQL per tutte le query che ti servono, e la transizione dalle tabelle MySQL alle tabelle SqlLite dovrebbe essere semplice (a patto che tu non abbia usato troppo cose specifiche di MySQL nel tuo database attuale finora).
Considera che se stai cercando di mantenere la copia locale delle tue tabelle di db completamente in righe di righe Python, a seconda della complessità del modello di dati, probabilmente finirai per costruire qualcosa come il tuo "povero-uomo" "database in memoria per conto tuo. Allora, perché reinventare la ruota?
Informazioni sull'interfaccia Python SqlLite: link . Un altro vantaggio: se i dati dell'indirizzo vengono aggiornati sul server, questo approccio consente più o meno facilmente di creare una copia del database una volta sul server e di inviare i dati in un file sulla rete al client.