Jag vet inte om det är snabbast, men du kan prova något sånt här...
Att lagra en Numpy-array i Redis går till så här - se funktionen toRedis()
:
- få formen på Numpy-arrayen och koda
- lägg till Numpy-matrisen som byte till formen
- lagra den kodade arrayen under den medföljande nyckeln
Att hämta en Numpy-array går till så här - se funktionen fromRedis()
:
- hämta från Redis den kodade strängen som motsvarar den angivna nyckeln
- extrahera formen på Numpy-matrisen från strängen
- extrahera data och fylla på Numpy-arrayen igen, omforma till originalform
#!/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)
Du kan lägga till mer flexibilitet genom att koda dtype
av Numpy-arrayen tillsammans med formen. Jag gjorde inte det eftersom det kan vara så att du redan vet att alla dina arrayer är av en specifik typ och då skulle koden bara vara större och svårare att läsa utan anledning.
Grovt riktmärke på modern iMac :
80x80 Numpy array of np.uint16 => 58 microseconds to write
200x200 Numpy array of np.uint16 => 88 microseconds to write
Sökord :Python, Numpy, Redis, array, serialisera, serialisera, nyckel, incr, unik