Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Najszybszy sposób na przechowywanie tablicy numpy w redis

Nie wiem, czy jest najszybszy, ale możesz spróbować czegoś takiego...

Przechowywanie tablicy Numpy w Redis przebiega w ten sposób — zobacz funkcję toRedis() :

  • uzyskaj kształt tablicy Numpy i zakoduj
  • dołącz tablicę Numpy jako bajty do kształtu
  • przechowuj zakodowaną tablicę pod dostarczonym kluczem

Pobieranie tablicy Numpy wygląda tak - zobacz funkcję fromRedis() :

  • pobierz z Redis zakodowany ciąg znaków odpowiadający dostarczonemu kluczowi
  • wyodrębnij kształt tablicy Numpy z łańcucha
  • wyodrębnij dane i ponownie wypełnij tablicę Numpy, zmień kształt do oryginalnego kształtu
#!/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])
   # Add slicing here, or else the array would differ from the original
   a = np.frombuffer(encoded[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)

Możesz dodać większą elastyczność, kodując dtype tablicy Numpy wraz z kształtem. Nie zrobiłem tego, ponieważ może być tak, że wiesz już, że wszystkie twoje tablice są jednego konkretnego typu, a wtedy kod byłby po prostu większy i trudniejszy do odczytania bez powodu.

Przybliżony test porównawczy na nowoczesnym iMacu :

80x80 Numpy array of np.uint16   => 58 microseconds to write
200x200 Numpy array of np.uint16 => 88 microseconds to write

Słowa kluczowe :Python, Numpy, Redis, tablica, serializuj, serializuj, klucz, incr, unikatowe



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. hdel wewnątrz bloku hget nodejs redis

  2. Jaki jest sens wielu baz danych Redis?

  3. Redis connect ECONNREFUSED w NodeJS w klastrze Kubernetes

  4. Trwałe dane z Redis do MongoDB dla magazynu danych

  5. Korzystanie z jedis, jak pisać do określonego gniazda/węzła w klastrze redis