Alcuni punti riguardanti la domanda e il codice di esempio.
-
Il pipelining non è un proiettile d'argento:devi capire cosa fa prima di usarlo. Ciò che fa il pipelining è raggruppare in batch diverse operazioni inviate in blocco, così come la loro risposta dal server. Quello che ottieni è che il tempo di andata e ritorno della rete per ogni operazione viene sostituito da quello del batch. Ma i lotti di dimensioni infinite sono un vero e proprio consumo di risorse:è necessario mantenere le loro dimensioni sufficientemente piccole per essere efficaci. Come regola generale, di solito cerco di puntare a 60 KB per pipeline e poiché ogni dato è diverso, lo stesso vale per il numero di operazioni effettive in una pipeline. Supponendo che la tua chiave e il suo valore siano ~1KB, devi chiamare
pipeline.execute()
ogni 60 operazioni circa. -
A meno che io non fraintenda grossolanamente, questo codice non dovrebbe essere eseguito. Stai usando
HMSET
come se fosseSET
, quindi in pratica ti manca il campo->mappatura del valore di Hash. Hash (HMSET
) e stringhe (SET
) sono tipi di dati diversi e dovrebbero pertanto essere utilizzati di conseguenza. -
Sembra che questo piccolo ciclo sia responsabile dell'intero "miliardo di dati" - in tal caso, non solo il tuo server che esegue il codice si scambierebbe come un matto a meno che non abbia molta RAM per contenere il dizionario, sarebbe anche molto inefficace (indipendentemente dalla velocità di Python). È necessario parallelizzare l'inserimento dei dati eseguendo più istanze di questo processo.
-
Ti stai connettendo a Redis da remoto? In tal caso, la rete potrebbe limitare le tue prestazioni.
-
Considera le impostazioni del tuo Redis:forse queste possono essere ottimizzate/regolate per prestazioni migliori per questa attività, supponendo che si tratti effettivamente di un collo di bottiglia.