sql >> Base de Datos >  >> NoSQL >> Redis

La forma más rápida de almacenar una matriz numpy en redis

No sé si es el más rápido, pero podrías intentar algo como esto...

El almacenamiento de una matriz Numpy en Redis es así:consulte la función toRedis() :

  • obtener la forma de la matriz Numpy y codificar
  • añade la matriz Numpy como bytes a la forma
  • almacene la matriz codificada bajo la clave proporcionada

La recuperación de una matriz Numpy es así:consulte la función fromRedis() :

  • recuperar de Redis la cadena codificada correspondiente a la clave suministrada
  • extraer la forma de la matriz Numpy de la cadena
  • extrae datos y vuelve a llenar la matriz Numpy, remodela a la forma original
#!/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)

Podría agregar más flexibilidad codificando el dtype de la matriz Numpy junto con la forma. No hice eso porque puede darse el caso de que ya sepa que todas sus matrices son de un tipo específico y entonces el código sería más grande y más difícil de leer sin ningún motivo.

Punto de referencia aproximado en el iMac moderno :

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

Palabras clave :Python, Numpy, Redis, matriz, serializar, serializar, clave, incr, único