sql >> Databasteknik >  >> NoSQL >> Redis

Snabbaste sättet att lagra en numpy array i redis

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



  1. Skäl för och emot att flytta från SQL-server till MongoDB

  2. Hur ignorerar man nollor samtidigt som man tar upp ett MongoDB-dokument?

  3. Skicka meddelanden till grupper i Django Channels 2

  4. Lagra flera versioner av data i Redis cache