Redis Ошибка сломанной трубы

Мы пытаемся УСТАНОВИТЬ маринованный объект размером 2,3 ГБ в redis через пакет redis-py. Обнаружена следующая ошибка.

BrokenPipeError: [Errno 32] сломанная труба

redis.exceptions.ConnectionError: Ошибка 104 при записи в сокет. Сброс соединения по пиру.

Я хотел бы понять причину. Это связано с ограничением буфера ввода / вывода на стороне сервера или на стороне клиента? Это связано с какими-либо ограничениями протокола RESP? Разрешено ли хранить в Redis одно значение (в байтах) 2,3 Гб?

импорт редис

r = redis.StrictRedis(host='10.XXX ', port = 7000, db = 0)

pickled_object = pickle.dumps (obj_to_be_pickled)

r.set ('some_key', pickled_object)

Ошибка на стороне клиента

BrokenPipeError: [Errno 32] сломанная труба

/usr/local/lib/python3.4/site-packages/redis/connection.py (544) send_packed_command ()

self._sock.sendall (пункт)

Ошибка на стороне сервера

31164:M 04 Apr 06:02:42.334 - Ошибка протокола от клиента: id=95 addr=10.2.130.144:36120 fd=11 name= age=0 бездействующих = 0 флагов =N db=0 sub=0 psub=0 multi=-1 qbuf=16384 qbuf-free=16384 obl=42 долларов = 0 ом = 0 событий =r cmd=NULL

31164: M 04 Apr 06: 07: 09.591 - Ошибка протокола от клиента: id=96 addr=10.2.130.144:36139 fd=11 name= age=9 бездействующих = 0 флагов =N db=0 sub=0 psub=0 multi=-1 qbuf=40 qbuf-free=32728 obl=42 oll=0 omem=0 событий =r cmd=NULL

Версия Redis: 3.2.8 / 64 бит

2 ответа

Решение

Тип данных Redis String может быть не более 512 МБ.

Проблема в том, что размер данных передается в Redis. Команда отправляется в Redis, поскольку два элемента соответствуют стандартам RESP

№ 1

b'*3\r\n$3\r\nSET\r\n$8\r\nsome_key\r\n$2460086692\r\n'

Where
    *3           - indicates RESP array of three elements
    \r\n         - indicates the RESP Carriage return Line Feeder(separator)
    $3           - indicates Bulk string of length 3 bytes(here it is 'SET')
    $8           - indicates Bulk String of length 8 bytes(he it is 'some_key')
    $2460086692  - indicates Bulk String of length 2460086692 bytes (the length of value 2460 MB to be passed to Redis as next item )

пункт № 2

b'\x80\x03csklearn.ensemble.forest\nRandomForestC...

Here item #2 indicates the actual data
  • В момент передачи инструкции № 1 серверу Redis сервер закрыл соединение, так как значение $2460086692 нарушило правило протокола 512 МБ.
  • Когда элемент № 2 отправляется на сервер Redis, мы получили исключение Broken Pipe, так как сервер уже закрыл соединение.
Другие вопросы по тегам