복붙노트

[REDIS] 레디 스에서 NumPy와 배열을 저장하는 가장 빠른 방법

REDIS

레디 스에서 NumPy와 배열을 저장하는 가장 빠른 방법

나는 AI 프로젝트 레디 스를 사용하고 있습니다.

아이디어는 CPU 코어의 많은에 대한 정책을 실행하는 여러 환경 시뮬레이터를하는 것입니다. 시뮬레이터는 레디 스 서버 (재생 버퍼)에 경력 (주 / 작업 / 보수 튜플들의 목록)을 작성. 그런 다음 교육 과정은 새 정책을 생성하는 데이터 세트와 같은 경험을 읽습니다. 새로운 정책이 시뮬레이터에 배포, 이전 실행에서 데이터가 삭제되고 프로세스가 계속됩니다.

경험의 대부분은 "상태"에 캡처됩니다. 보통 80 X 80 시뮬레이터 빠른 CPU가 허용 이러한 생성, 치수 말 큰 NumPy와 배열로 표시된다.

이를 위해, 사람이 레디 스에 NumPy와 배열을 많이 쓰는 좋은 아이디어 나 최고 / 빠른 / 간단한 방법의 경험을 가지고있다. 이 같은 시스템의 모든하지만, 나중에, 클라우드 서버 집합에있을 수 있습니다. 코드 샘플을 환영합니다!

해결법

  1. ==============================

    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. ==============================

    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')
    
  3. from https://stackoverflow.com/questions/55311399/fastest-way-to-store-a-numpy-array-in-redis by cc-by-sa and MIT license