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