Redis
 sql >> Datenbank >  >> NoSQL >> Redis

Der schnellste Weg, ein numpy-Array in Redis zu speichern

Ich weiß nicht, ob es am schnellsten ist, aber du könntest so etwas versuchen ...

Das Speichern eines Numpy-Arrays in Redis geht so – siehe Funktion toRedis() :

  • Form des Numpy-Arrays abrufen und codieren
  • Hänge das Numpy-Array als Bytes an die Form an
  • Speichern Sie das verschlüsselte Array unter dem angegebenen Schlüssel

Das Abrufen eines Numpy-Arrays geht so - siehe Funktion fromRedis() :

  • von Redis die codierte Zeichenfolge abrufen, die dem bereitgestellten Schlüssel entspricht
  • extrahieren Sie die Form des Numpy-Arrays aus der Zeichenfolge
  • Daten extrahieren und Numpy-Array neu füllen, in ursprüngliche Form bringen
#!/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)

Sie könnten mehr Flexibilität hinzufügen, indem Sie den dtype codieren des Numpy-Arrays zusammen mit der Form. Ich habe das nicht getan, da Sie möglicherweise bereits wissen, dass alle Ihre Arrays von einem bestimmten Typ sind, und der Code dann ohne Grund einfach größer und schwerer zu lesen wäre.

Grober Benchmark auf modernen iMac :

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

Schlüsselwörter :Python, Numpy, Redis, Array, serialisieren, serialisieren, key, incr, unique