Alguns pontos sobre a pergunta e o código de exemplo.
-
Pipelining não é uma bala de prata - você precisa entender o que ele faz antes de usá-lo. O que o pipelining faz é agrupar várias operações que são enviadas em massa, assim como a resposta do servidor. O que você ganha é que o tempo de ida e volta da rede para cada operação é substituído pelo do lote. Mas os lotes de tamanho infinito são um verdadeiro dreno de recursos - você precisa manter seu tamanho pequeno o suficiente para ser eficaz. Como regra geral, geralmente tento apontar para 60 KB por pipeline e, como todos os dados são diferentes, o mesmo acontece com o número de operações reais em um pipeline. Supondo que sua chave e seu valor sejam ~ 1 KB, você precisa chamarpipeline.execute()
a cada 60 operações mais ou menos.
-
A menos que eu entenda mal, esse código não deve ser executado. Você está usandoHMSET
como se fosseSET
, então você está basicamente perdendo o mapeamento field->value de Hashes. Hashs (HMSET
) e Strings (SET
) são tipos de dados diferentes e, portanto, devem ser usados de acordo.
-
Parece que este pequeno loop é responsável por todo o "Billion of data" - se for esse o caso, não apenas o seu servidor executando o código estaria trocando como um louco, a menos que tenha muita RAM para armazenar o dicionário, também seria muito ineficaz (independentemente da velocidade do Python). Você precisa paralelizar a inserção de dados executando várias instâncias desse processo.
-
Você está se conectando ao Redis remotamente? Nesse caso, a rede pode estar limitando seu desempenho.
-
Considere as configurações do seu Redis - talvez elas possam ser ajustadas/ajustadas para melhor desempenho nessa tarefa, supondo que seja realmente um gargalo.