Няколко точки относно въпроса и примерния код.
-
Pipelining не е сребърен куршум - трябва да разберете какво прави, преди да го използвате. Това, което прави тръбопровода, е да групира няколко операции, които се изпращат като групово, както и отговорът им от сървъра. Това, което печелите, е, че времето за двупосочно пътуване на мрежата за всяка операция се заменя с това на партидата. Но партидите с безкрайни размери са истинско източване на ресурси - трябва да поддържате размера им достатъчно малък, за да бъдат ефективни. Като правило обикновено се опитвам да се стремя към 60KB на конвейер и тъй като всички данни са различни, броят на действителните операции в конвейера е различен. Ако приемем, че вашият ключ и неговата стойност са ~1KB, трябва да извикате
pipeline.execute()
на всеки 60 операции. -
Освен ако грубо не разбирам, този код не трябва да се изпълнява. Използвате
HMSET
сякаш еSET
, така че по същество ви липсва съпоставянето на поле->стойност на хешовете. Хешове (HMSET
) и низове (SET
) са различни типове данни и следователно трябва да се използват съответно. -
Изглежда, сякаш този един малък цикъл отговаря за целия "милиард данни" - ако това е така, не само вашият сървър, изпълняващ кода, ще се разменя като луд, освен ако няма много RAM, за да държи речника, също би било много неефективно (независимо от скоростта на Python). Трябва да паралелизирате вмъкването на данни, като стартирате няколко екземпляра на този процес.
-
Свързвате ли се с Redis дистанционно? Ако е така, мрежата може да ограничава производителността ви.
-
Помислете за настройките на вашия Redis – може би те могат да бъдат настроени/настроени за по-добра производителност за тази задача, като се приеме, че това наистина е тясно място.