Redis
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> Redis

Cách nhanh nhất để lưu trữ một mảng numpy trong redis

Tôi không biết nó có nhanh nhất không, nhưng bạn có thể thử một cái gì đó như thế này ...

Lưu trữ một mảng Numpy vào Redis diễn ra như thế này - xem hàm toRedis() :

  • lấy hình dạng của mảng Numpy và mã hóa
  • nối mảng Numpy dưới dạng byte vào hình dạng
  • lưu trữ mảng được mã hóa dưới khóa được cung cấp

Truy xuất mảng Numpy diễn ra như thế này - xem hàm fromRedis() :

  • truy xuất từ ​​Redis chuỗi được mã hóa tương ứng với khóa được cung cấp
  • trích xuất hình dạng của mảng Numpy từ chuỗi
  • trích xuất dữ liệu và tạo lại mảng Numpy, định hình lại thành hình dạng ban đầu
#!/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)

Bạn có thể thêm tính linh hoạt bằng cách mã hóa dtype của mảng Numpy cùng với hình dạng. Tôi đã không làm điều đó vì có thể bạn đã biết tất cả các mảng của mình thuộc một loại cụ thể và sau đó mã sẽ lớn hơn và khó đọc hơn mà không có lý do gì.

Điểm chuẩn cao trên iMac hiện đại :

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

Từ khóa :Python, Numpy, Redis, array, serialise, serialize, key, incr, unique



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Sự khác biệt giữa lưu trữ Số nguyên và Chuỗi trong Redis

  2. Ruby - mutex dựa trên Redis với triển khai hết hạn

  3. F # Nhiều thuộc tính CLIMutable DataContract

  4. Cách hiệu quả là đặt lại cập nhật thành viên

  5. Laravel:Làm thế nào để kiểm tra tính khả dụng của Redis?