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