Kilka punktów dotyczących pytania i przykładowego kodu.
-
Pipelining to nie srebrna kula — musisz zrozumieć, co robi, zanim go użyjesz. To, co robi potokowanie, to wsadowe kilka operacji, które są wysyłane zbiorczo, podobnie jak ich odpowiedź z serwera. Zyskujesz to, że czas podróży w obie strony sieci dla każdej operacji jest zastępowany przez czas wsadu. Jednak partie o nieskończonej wielkości są prawdziwym drenażem zasobów — aby były skuteczne, należy zachować ich rozmiar na tyle mały. Z reguły staram się dążyć do 60 KB na potok, a ponieważ każde dane są inne, to samo dotyczy liczby rzeczywistych operacji w potoku. Zakładając, że twój klucz i jego wartość to ~1KB, musisz wywołać
pipeline.execute()
co około 60 operacji. -
O ile rażąco nie rozumiem, ten kod nie powinien działać. Używasz
HMSET
jakby to byłoSET
, więc w zasadzie brakuje mapowania pola->wartości haszów. Hash (HMSET
) i Strings (SET
) są różnymi typami danych i dlatego należy ich używać odpowiednio. -
Wygląda na to, że ta jedna mała pętla jest odpowiedzialna za cały „miliard danych” - w takim przypadku serwer, na którym działa kod, nie tylko zmieniałby się jak szalony, chyba że ma dużo pamięci RAM do przechowywania słownika, byłoby to również bardzo nieefektywne (niezależnie od szybkości Pythona). Musisz zrównoleglić wstawianie danych, uruchamiając wiele instancji tego procesu.
-
Czy łączysz się z Redis zdalnie? Jeśli tak, sieć może ograniczać wydajność.
-
Zastanów się nad ustawieniami Redisa — być może można je poprawić/dostroić, aby uzyskać lepszą wydajność tego zadania, zakładając, że rzeczywiście jest to wąskie gardło.