2017-04-04 5 views
0

우리는 redis-py 패키지를 통해 크기 2.3GB의 피클 링 된 개체를 설정하려고합니다. 다음 오류가 발생했습니다.깨진 파이프 오류 Redis

BrokenPipeError: [Errno 32] Broken pipe

redis.exceptions.ConnectionError: Error 104 while writing to socket. Connection reset by peer.

근본 원인을 알고 싶습니다. 그것은 서버 측 또는 클라이언트 측에서 입출력 버퍼 제한으로 인한 것입니까? RESP 프로토콜에 대한 제한 사항 때문입니까? Redis에 저장할 수있는 2.3Gb의 단일 값 (바이트)이 있습니까?

import redis

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

pickled_object = pickle.dumps(obj_to_be_pickled)

r.set('some_key', pickled_object)

클라이언트 측 오류

BrokenPipeError: [Errno 32] Broken pipe

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

self._sock.sendall(item)

서버 측 오류

31164:M 04 Apr 06:02:42.334 - Protocol error from client: id=95 addr=10.2.130.144:36120 fd=11 name= age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=16384 qbuf-free=16384 obl=42 oll=0 omem=0 events=r cmd=NULL

31164:M 04 Apr 06:07:09.591 - Protocol error from client: id=96 addr=10.2.130.144:36139 fd=11 name= age=9 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=40 qbuf-free=32728 obl=42 oll=0 omem=0 events=r cmd=NULL

레디 스 버전 : 3.2.8/64 비트

답변

0

레디 스 'String 데이터 유형이 할 수있는 모스에있다. t 512MB.

1

문제는 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 명령은 레디 스 서버로 전달되고 , 서버가 $ 2460086692 값이 프로토콜 규칙 512MB를 위반하여 연결을 닫음
  • 항목 2가 Redis Server로 보내지면 Broken P 연결이 서버에 의해 이미 닫혀 있으므로 ipe 예외가 발생합니다.