Ik weet niet of het het snelst is, maar je zou zoiets kunnen proberen...
Het opslaan van een Numpy-array naar Redis gaat als volgt - zie functie toRedis()
:
- vorm van Numpy-array krijgen en coderen
- voeg de Numpy-array als bytes toe aan de vorm
- bewaar de gecodeerde array onder de meegeleverde sleutel
Het ophalen van een Numpy-array gaat als volgt - zie functie fromRedis()
:
- haal uit Redis de gecodeerde tekenreeks op die overeenkomt met de opgegeven sleutel
- extraheer de vorm van de Numpy-array uit de string
- Gegevens extraheren en Numpy-array opnieuw vullen, omvormen tot oorspronkelijke vorm
#!/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)
U kunt meer flexibiliteit toevoegen door het dtype
. te coderen van de Numpy-array samen met de vorm. Ik heb dat niet gedaan omdat het zo kan zijn dat je al weet dat al je arrays van één specifiek type zijn en dan zou de code alleen maar groter en moeilijker te lezen zijn zonder reden.
Ruwe benchmark op moderne iMac :
80x80 Numpy array of np.uint16 => 58 microseconds to write
200x200 Numpy array of np.uint16 => 88 microseconds to write
Zoekwoorden :Python, Numpy, Redis, array, serialize, serialize, key, incr, unique