sql >> Databáze >  >> NoSQL >> Redis

Nejrychlejší způsob uložení numpy pole v redis

Nevím, jestli je to nejrychlejší, ale můžete zkusit něco takového...

Uložení pole Numpy do Redis probíhá takto - viz funkce toRedis() :

  • získat tvar pole Numpy a zakódovat
  • připojit pole Numpy jako bajty k tvaru
  • uložte zakódované pole pod dodaný klíč

Načtení pole Numpy probíhá takto – viz funkce fromRedis() :

  • načíst z Redis zakódovaný řetězec odpovídající dodanému klíči
  • extrahujte tvar pole Numpy z řetězce
  • extrahovat data a znovu naplnit pole Numpy, změnit tvar do původního tvaru
#!/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)

Více flexibility můžete přidat kódováním dtype pole Numpy spolu s tvarem. Neudělal jsem to, protože se může stát, že už víte, že všechna vaše pole jsou jednoho konkrétního typu, a pak by byl kód bezdůvodně větší a hůře čitelný.

Drsný benchmark na moderním iMacu :

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

Klíčová slova :Python, Numpy, Redis, pole, serializace, serializace, klíč, incr, jedinečný



  1. MongoDB Write Concern:3 Must Know Caveats

  2. Jak odstranit všechny položky ze sbírky MongoDB

  3. MongoDB bulkWrite()

  4. MongoDB Zobrazit aktuálního uživatele