Redis
 sql >> Teknologi Basis Data >  >> NoSQL >> Redis

Cara tercepat untuk menyimpan array numpy di redis

Saya tidak tahu apakah ini yang tercepat, tetapi Anda dapat mencoba sesuatu seperti ini...

Menyimpan array Numpy ke Redis berjalan seperti ini - lihat fungsi toRedis() :

  • mendapatkan bentuk array Numpy dan mengkodekan
  • tambahkan array Numpy sebagai byte ke bentuk
  • menyimpan larik yang disandikan di bawah kunci yang disediakan

Mengambil array Numpy berjalan seperti ini - lihat fungsi fromRedis() :

  • mengambil dari Redis string yang disandikan sesuai dengan kunci yang diberikan
  • mengekstrak bentuk array Numpy dari string
  • mengekstrak data dan mengisi kembali array Numpy, membentuk kembali ke bentuk aslinya
#!/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)

Anda dapat menambahkan lebih banyak fleksibilitas dengan menyandikan dtype dari array Numpy bersama dengan bentuknya. Saya tidak melakukannya karena mungkin Anda sudah mengetahui bahwa semua array Anda adalah satu tipe tertentu dan kodenya akan menjadi lebih besar dan lebih sulit untuk dibaca tanpa alasan.

Tolok ukur kasar pada iMac modern :

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

Kata Kunci :Python, Numpy, Redis, array, serialisasi, serialisasi, kunci, incr, unik



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Bagaimana seharusnya saya menggunakan Booksleeve dengan protobuf-net?

  2. Migrasi socket.io dari 0.9.x ke 1.x, Masalah dengan mengkonfigurasi RedisStore

  3. Rails Redis mengatur maxmemory dan maxmemory-policy

  4. Redis Expire tidak berfungsi

  5. Bagaimana melakukan GROUP BY di Redis