[REDIS] 레디 스에서 NumPy와 배열을 저장하는 가장 빠른 방법
REDIS레디 스에서 NumPy와 배열을 저장하는 가장 빠른 방법
나는 AI 프로젝트 레디 스를 사용하고 있습니다.
아이디어는 CPU 코어의 많은에 대한 정책을 실행하는 여러 환경 시뮬레이터를하는 것입니다. 시뮬레이터는 레디 스 서버 (재생 버퍼)에 경력 (주 / 작업 / 보수 튜플들의 목록)을 작성. 그런 다음 교육 과정은 새 정책을 생성하는 데이터 세트와 같은 경험을 읽습니다. 새로운 정책이 시뮬레이터에 배포, 이전 실행에서 데이터가 삭제되고 프로세스가 계속됩니다.
경험의 대부분은 "상태"에 캡처됩니다. 보통 80 X 80 시뮬레이터 빠른 CPU가 허용 이러한 생성, 치수 말 큰 NumPy와 배열로 표시된다.
이를 위해, 사람이 레디 스에 NumPy와 배열을 많이 쓰는 좋은 아이디어 나 최고 / 빠른 / 간단한 방법의 경험을 가지고있다. 이 같은 시스템의 모든하지만, 나중에, 클라우드 서버 집합에있을 수 있습니다. 코드 샘플을 환영합니다!
해결법
-
==============================
1.이 빠른 경우는 모르겠지만, 당신은 이런 식으로 뭔가를 시도 할 수 ...
이 빠른 경우는 모르겠지만, 당신은 이런 식으로 뭔가를 시도 할 수 ...
레디 스에 NumPy와 배열을 저장하는 단계 이렇게되면 - (기능 toRedis 참조) :
NumPy와 배열을 가져 오는 이렇게되면 - (기능 fromRedis 참조) :
#!/usr/bin/env python3 import struct import redis import numpy as np def toRedis(r,a,n): """Store given Numpy array 'a' in Redis under key 'n'""" h, w = a.shape shape = struct.pack('>II',h,w) encoded = shape + a.tobytes() # Store encoded data in Redis r.set(n,encoded) return def fromRedis(r,n): """Retrieve Numpy array from Redis key 'n'""" encoded = r.get(n) h, w = struct.unpack('>II',encoded[:8]) a = np.frombuffer(encoded, dtype=np.uint16, offset=8).reshape(h,w) return a # Create 80x80 numpy array to store a0 = np.arange(6400,dtype=np.uint16).reshape(80,80) # Redis connection r = redis.Redis(host='localhost', port=6379, db=0) # Store array a0 in Redis under name 'a0array' toRedis(r,a0,'a0array') # Retrieve from Redis a1 = fromRedis(r,'a0array') np.testing.assert_array_equal(a0,a1)
당신은 모양과 함께 NumPy와 배열의 DTYPE을 인코딩하여 더 많은 유연성을 추가 할 수 있습니다. 나는하지 않았다 당신이 이미 모든 배열이 특정 유형이며, 다음 코드를 그냥 아무 이유없이 읽을 더 크고 더 어려울 것이라고 알고있는 경우가 될 수 있기 때문이다.
현대 아이맥에 거친 벤치 마크 :
80x80 Numpy array of np.uint16 => 58 microseconds to write 200x200 Numpy array of np.uint16 => 88 microseconds to write
키워드 : 파이썬, NumPy와, 레디 스, 배열, 직렬화를, 직렬화, 키, 증분, 독특한
-
==============================
2.tobytes () 함수는 매우 효율적인 저장 아니다. 레디 스 서버에 기록 할 수있는 스토리지를 줄이기 위해, 당신은 base64로 패키지를 사용할 수 있습니다 :
tobytes () 함수는 매우 효율적인 저장 아니다. 레디 스 서버에 기록 할 수있는 스토리지를 줄이기 위해, 당신은 base64로 패키지를 사용할 수 있습니다 :
def encode_vector(ar): return base64.encodestring(ar.tobytes()).decode('ascii') def decode_vector(ar): return np.fromstring(base64.decodestring(bytes(ar.decode('ascii'), 'ascii')), dtype='uint16')
from https://stackoverflow.com/questions/55311399/fastest-way-to-store-a-numpy-array-in-redis by cc-by-sa and MIT license
'REDIS' 카테고리의 다른 글
[REDIS] 하나의 클라이언트에 의해 레디 스 시계 MULTI EXEC (0) | 2020.01.01 |
---|---|
[REDIS] 코드의 의미를 - " 'X'= * ((1) (문자 *를))"무슨 일입니까? (0) | 2020.01.01 |
[REDIS] 어떻게 레디 스를 사용하여 NodeJs와 PHP 사이에 공유 세션에? (0) | 2020.01.01 |
[REDIS] 당신은 레디 스에 저장할 수있는 최대 값의 크기는 얼마입니까? (0) | 2020.01.01 |
[REDIS] 어떻게 내가 protobuf - 그물 Booksleeve을 이용해야 하는가? (0) | 2020.01.01 |