最速かどうかはわかりませんが、このようなことを試してみてください...
Numpy配列をRedisに格納するのは次のようになります-関数toRedis()
を参照してください :
- Numpy配列の形状を取得し、エンコードします
- Numpy配列をバイトとしてシェイプに追加します
- エンコードされた配列を提供されたキーの下に保存します
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配列の。すべての配列が1つの特定のタイプであることをすでに知っている場合があり、コードが大きくなり、理由もなく読みにくくなる可能性があるため、これは行いませんでした。
最新の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