РЕДАКТИРОВАТЬ2
Кажется, одно решение состоит в том, чтобы не вставлять весь набор сразу, а использовать несколько команд sadd
для одной клавиши, если набор большой ... такнабор с 1М элементов может быть вставлен в redis за 100 порций, чтобы избежать тайм-аута ... все же было бы неплохо узнать, есть ли параметр тайм-аута, который позволял бы вставлять весь набор в один вызов sadd
...
РЕДАКТИРОВАТЬ
Минимальный пример сбоя
someints = list(range(2000000))
redis_client.sadd(2, *someints)
Какой параметр тайм-аута мне нужно увеличить, чтобы это исправить?
MAIN
redis version = 4.0.9
(работает на локальном хосте)
redis-py version = 3.1.0
python version = 3.6.8
Я пытаюсь связать одно целочисленные ключи с целочисленными наборами в базе данных redis, используя redis-py.У меня около 5 миллионов целочисленных ключей и столько же целых наборов.Сначала я использовал конвейер redis-py для пакетирования команд sadd
, но переключился на один вызов sadd
для каждой пары набор ключей для отладки.Самый большой набор имеет около 1 миллиона целых чисел и всегда вызывает ошибку тайм-аута и / или сброса соединения.Я попытался установить различные параметры времени ожидания, используя py-redis, но, похоже, не могу избежать тайм-аута / сброса соединения.Я вручную реализовал блок try / исключением, который повторяет команду sadd
, если она не работает и кажется, что она сработала (один раз), но мне интересно, есть ли какие-нибудь параметры redis, которые я не вижу, которые позволят выполнить работу?
Пары ключ / набор происходят из psycopg2 DictCursor
, который я повторяю.Я могу сначала попытаться вытащить их все в память, чтобы исключить вероятность того, что тайм-аут вызван взаимодействием между курсором psycopg и redis (но я не думаю, что это проблема).
for irow, row in enumerate(cursor):
redis_client.sadd(row["nqid"], *row["nqids"])
Я использую следующие параметры для подключения redis
redis_conn_dict = {
... host info ...
"socket_timeout": 3600,
"socket_connect_timeout": 60,
"socket_keepalive": True,
"retry_on_timeout": True,
}
redis_client = redis.Redis(**redis_conn_dict)
Ошибки, которые я вижу, выглядят так,
Traceback (most recent call last):
File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 599, in send_packed_command
self._sock.sendall(item)
ConnectionResetError: [Errno 104] Connection reset by peer
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "links_to_redis.py", line 108, in <module>
pg_schema, links_table, pg_conn_dict, redis_conn_dict, dryrun=clargs.dryrun
File "links_to_redis.py", line 44, in insert_table_into_redis
redis_client.sadd(row["nqid"], *row["nqids"])
File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/client.py", line 1878, in sadd
return self.execute_command('SADD', name, *values)
File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/client.py", line 774, in execute_command
connection.send_command(*args)
File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 619, in send_command
self.send_packed_command(self.pack_command(*args))
File "/home/ubuntu/anaconda3/envs/kwiki36/lib/python3.6/site-packages/redis/connection.py", line 612, in send_packed_command
(errno, errmsg))
redis.exceptions.ConnectionError: Error 104 while writing to socket. Connection reset by peer.