5

一時的なメモリ内キー値ストアのようなものが必要です。Redis のようなソリューションがあることは知っています。しかし、Python 辞書を使用するとうまくいくのでしょうか? さらに速くなる可能性はありますか?したがって、Tornado (または同様の) サーバーが実行され、Python 辞書をメモリに保持し、HTTP 要求に基づいて適切な値を返すだけだと考えてください。

なぜこれが必要なのですか?サービスの一部としてキー値が保存されますが、キー値には次のような性質があります。新しいものほど、アクセスされる可能性が高くなります。したがって、取得を高速化するために、最後の 100 個のキー値をメモリ内 (およびディスクへの書き込み) に保持したいと考えています。

サーバーが停止した場合、ディクショナリはディスクから再度復元できます。

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

PS: WSGI サーバーでは不可能だと思いますよね? 私の知る限り、個々のリクエスト間で何かをメモリに保持することはできません。

4

6 に答える 6

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')

この種の最適化は時間の無駄になるため、ネットワーク遅延は気にしないでください

于 2012-03-21T08:28:34.907 に答える
3

インプロセスの Python ディクショナリは、memcached サーバーよりもはるかに高速です数日前に行った厳密でないベンチマークによると、1 回の get は、インプロセスの Python 辞書を使用して約 2 秒かかり、localhost でリッスンしている memcached サーバーを使用して約 50 秒かかりました。私のベンチマークでは、C クライアントとして libmemcached を使用し、この C クライアントの python ラッパーとして python-libmemcached を使用していました。

于 2013-01-17T11:43:12.020 に答える
1

私は似たようなことを試していますが、コアキャッシュ ライブラリは、いくつかのキャッシング システムをテストする優れた方法です。 https://pypi.python.org/pypi/cachecore

特に、SimpleCache の実装はバニラの python dict に依存しており、私の予備テストでは非常に高速で、memcached をローカルで呼び出すよりも 10 倍高速です (キャッシュが必要な Python アプリケーション、おそらくあなたの場合は tornado サービスに既にいると仮定します)。 .

于 2013-07-11T13:41:36.683 に答える
1

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


別々のものを作成している場合、基本的にはこれmemcachedが目的です。車輪を再発明しないでください。

于 2012-03-21T07:41:49.027 に答える
0

それは可能であり、ネットワーク遅延がないため、redis/memcache よりもはるかに高速です。cPickle を使用して、時々辞書をダンプできます。ただし、プログラムがサブプロセスを生成する場合、1 つのプロセスで値を更新しても他のプロセスには影響しない場合は注意が必要です。

于 2012-03-21T07:43:19.170 に答える
0
  1. 最後のデータをdictにキャッシュするだけで、誰もそれを禁止しておらず、1サーバー環境で動作します
  2. 新しいデータが追加されたら、いくつかの redis (memcachedb) に保存します。
  3. サーバーの再起動時 - 最新の N レコードをディクショナリにロードするだけです

すべてはデータ量に依存します。複雑な構造をPythonの辞書に保持するには、より多くのメモリが必要だと思います。アクセスは高速になると思いました-はい

于 2012-03-23T09:30:14.287 に答える