Je ne sais pas si c'est le plus rapide, mais vous pouvez essayer quelque chose comme ça...
Stocker un tableau Numpy dans Redis ressemble à ceci - voir la fonction toRedis()
:
- obtenir la forme du tableau Numpy et encoder
- ajouter le tableau Numpy sous forme d'octets à la forme
- stocker le tableau encodé sous la clé fournie
La récupération d'un tableau Numpy se passe comme ceci - voir la fonction fromRedis()
:
- récupérer de Redis la chaîne encodée correspondant à la clé fournie
- extraire la forme du tableau Numpy de la chaîne
- extraire les données et repeupler le tableau Numpy, remodeler à la forme d'origine
#!/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)
Vous pouvez ajouter plus de flexibilité en encodant le dtype
du tableau Numpy avec la forme. Je ne l'ai pas fait car il se peut que vous sachiez déjà que tous vos tableaux sont d'un type spécifique et que le code serait simplement plus gros et plus difficile à lire sans raison.
Besoin de référence approximatif sur l'iMac moderne :
80x80 Numpy array of np.uint16 => 58 microseconds to write
200x200 Numpy array of np.uint16 => 88 microseconds to write
Mots clés :Python, Numpy, Redis, tableau, sérialiser, sérialiser, clé, incr, unique