Redis
 sql >> база данни >  >> NoSQL >> Redis

Най-бързият начин за съхранение на numpy масив в redis

Не знам дали е най-бързо, но можете да опитате нещо подобно...

Съхраняването на масив Numpy в Redis става така - вижте функцията toRedis() :

  • вземете форма на масива Numpy и го кодирайте
  • добавете масива Numpy като байтове към формата
  • съхранете кодирания масив под предоставения ключ

Извличането на масив Numpy става така - вижте функцията fromRedis() :

  • извлечете от Redis кодирания низ, съответстващ на предоставения ключ
  • извлечете формата на масива Numpy от низа
  • извличане на данни и повторно попълване на масива Numpy, преоформяне до оригиналната форма
#!/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)

Можете да добавите повече гъвкавост, като кодирате dtype на масива Numpy заедно с формата. Не го направих, защото може да се окаже, че вече знаете, че всичките ви масиви са от един конкретен тип и тогава кодът просто ще бъде по-голям и по-труден за четене без причина.

Груб тест за съвременен iMac :

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

Ключови думи :Python, Numpy, Redis, масив, сериализиране, сериализиране, ключ, incr, уникален



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да настроите времето за изчакване за четене на клиент Redis на възел?

  2. Споделяне на сесии с redis и паспорт на поддомейн?

  3. екшън кабел се абонира локално, но не и на heroku

  4. Memcache v/s redis за поддържане на постоянни сесии?

  5. Redis - някакъв начин за задействане на събитие, когато стойността вече не се записва активно?