sql >> データベース >  >> NoSQL >> Redis

numpy配列をredisに格納する最速の方法

    最速かどうかはわかりませんが、このようなことを試してみてください...

    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



    1. MongoDB C#ドライバーを使用したポリモーフィック型の逆シリアル化

    2. mongodを使用してUTCに日付を保存するときにタイムゾーンの問題に対処するにはどうすればよいですか?

    3. マングースの検索/更新サブドキュメント

    4. MongoDB4.2の新機能