Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

रेडिस में एक संख्यात्मक सरणी को स्टोर करने का सबसे तेज़ तरीका

मुझे नहीं पता कि यह सबसे तेज़ है या नहीं, लेकिन आप कुछ इस तरह आज़मा सकते हैं...

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



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. क्या दो मॉड्यूल एक ही रेडिस कनेक्शन का उपयोग करना चाहिए? (मैं फ्लास्क के साथ काम कर रहा हूं)

  2. 500MB Redis dump.rdb फ़ाइल में लगभग 5.0GB मेमोरी क्यों लगती है?

  3. ubuntu14.04 में रेडिस-सर्वर:बाइंड एड्रेस पहले से उपयोग में है

  4. रेडिस कीज कमांड में 'OR' कंडीशन कैसे लागू करें

  5. डॉकर [इरनो 111] कनेक्ट कॉल विफल ('127.0.0.1', 6379)