2012-03-21 16 views
5

一時的なメモリ内のキー値ストアのようなものが必要です。私はRedisのような解決策があることを知っています。しかし、私はPython辞書を使用することができますか?潜在的にはさらに高速でしょうか? したがって、メモリにPython辞書を実行して保持しているTornado(またはそれに類似した)サーバーが、HTTPリクエストに基づいて適切な値を返すと考えてください。Python辞書を一時的なメモリ内のキー値データベースとして使用していますか?

なぜこれが必要ですか? サービスの一部として、キー値が格納されていますが、これらのプロパティにはアクセスされる可能性が高いほど最近値が表示されます。だから私は速い検索のためにメモリに最後の100のキー値を(ディスクへの書き込みだけでなく)続けておきたいと思います。

サーバーが死んだ場合、辞書はディスクから再度リストアできます。

誰もこのようなことをしましたか?ここに何かが完全に欠けていますか?

PS:WSGIサーバーでは不可能だと思いますよね?なぜなら私が知っている限り、あなたは個々の要求の間に何かを記憶しておくことができないからです。

答えて

4

私は間違いなくmemcachedで作業します。それがセットアップされたら、それは私の例で行われているように簡単にあなたの関数/メソッドを飾ることができます:最適化のようなものがあなた時間の無駄になりますので、

#!/usr/bin/env python 

import time 
import memcache 
import hashlib 

def memoize(f): 

    def newfn(*args, **kwargs): 
     mc = memcache.Client(['127.0.0.1:11211'], debug=0) 
     # generate md5 out of args and function 
     m = hashlib.md5() 
     margs = [x.__repr__() for x in args] 
     mkwargs = [x.__repr__() for x in kwargs.values()] 
     map(m.update, margs + mkwargs) 
     m.update(f.__name__) 
     m.update(f.__class__.__name__) 
     key = m.hexdigest() 

     value = mc.get(key) 
     if value: 
      return value 
     else: 
      value = f(*args, **kwargs) 
      mc.set(key, value, 60) 
      return value 
     return f(*args) 

    return newfn 

@memoize 
def expensive_function(x): 
    time.sleep(5) 
    return x 

if __name__ == '__main__': 
    print expensive_function('abc') 
    print expensive_function('abc') 

は、ネットワークの遅延を気にしないでください。

0

実際のサービスを実行しているサーバーと同じサーバーに辞書をバンドルする場合は、正常に動作します。


あなたは別のものを作成している場合は、まあ、これはmemcachedが何のためにあるのか、基本的です。 Don't reinvent the wheel.

0

ネットワークの待ち時間がないため、可能ですが、redis/memcacheよりもはるかに高速です。 cPickleを使用して辞書を一度にダンプすることができます。しかし、あなたのプログラムがサブプロセスを生成し、あるプロセスで値を更新しても他のプロセスに影響を与えないのは難しいです。

+0

OPが覚書を要求しているトルネードサーバーを指しているとすれば、まだネットワークの待ち時間があることになります。 – Amber

+0

@amberではなく、memcache/redisには適用されません。 –

+0

OPが竜巻を介して* memcache/redisを再実装することが示唆されているようです。 – Amber

0
  1. あなたは辞書では、誰もがそれについてだけキャッシュ最後のデータを禁止していない可能性があり、それが一サーバー環境で動作します
  2. 新しいデータを追加する場合 - いくつかのRedis(memcachedb)
  3. サーバーの再起動にそれを保存します - 最新のNレコードを辞書にロードする

すべてはデータ量によって異なります。

2

処理中のPython辞書は、memcachedサーバよりも速いの方法です。私はそれがpythonの辞書で複雑な構造を維持するために、より多くのメモリを必要と信じています。私が数日前に行った非厳密なベンチマークによると、単一のgetには、プロセス内のPython辞書を使用して約2秒かかり、ローカルホストでリッスンしているmemcachedサーバーを使用して約50usかかります。私のベンチマークでは、Cクライアントとしてlibmemcachedを使用していましたが、Pythonラッパーとしてpython-libmemcachedを使用していました。

1

私は同様のものを試しています。また、corecacheライブラリは、いくつかのキャッシングシステムをテストするのに最適な方法です。特に https://pypi.python.org/pypi/cachecore

は、彼らのSimpleCacheの実装はバニラPythonの辞書に依存している、と私の予備試験では、局所的にmemcachedをcallingがより10倍高速(私はおそらく、キャッシュを必要とするPythonアプリケーションですでにだと仮定すると、非常に高速ですあなたのケースでは竜巻サービス)。

関連する問題