मुझे नहीं पता कि यह सबसे तेज़ है या नहीं, लेकिन आप कुछ इस तरह आज़मा सकते हैं...
Redis के लिए एक Numpy सरणी संग्रहीत करना इस प्रकार है - फ़ंक्शन देखें toRedis()
:
- नम्पी एरे और एनकोड का आकार प्राप्त करें
- नम्पी सरणी को आकार में बाइट्स के रूप में जोड़ें
- एन्कोडेड सरणी को आपूर्ति की गई कुंजी के अंतर्गत संग्रहीत करें
एक 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, array, serialise, serialize, key, incr, unique