5

私の django アプリケーションは、25MB のバイナリ ファイルを処理します。それぞれに、それぞれ 256 バイトの約 100,000 の「レコード」があります。

ディスクからバイナリ ファイルを読み取り、python の struct モジュールを使用してデコードするのに約 7 秒かかります。データを約 100,000 項目のリストに変換します。各項目は、さまざまな型 (float、string など) の値を持つ辞書です。

私の django ビューは、このリストを検索する必要があります。明らかに7秒は長すぎます。

django の低レベルのキャッシュ API を使用してリスト全体をキャッシュしようとしましたが、キャッシュされた単一のアイテムの最大サイズが 1 MB に制限されているため、うまくいきません。100,000 個のリスト アイテムを個別にキャッシュしようとしましたが、7 秒以上かかります。ほとんどの時間はアイテムの unpickle に費やされます。

リクエスト間で大きなリストをメモリに保存する便利な方法はありますか? 私のdjangoアプリで使用するためにオブジェクトをキャッシュする別の方法を考えられますか?

4

2 に答える 2

9

アイテムサイズの制限を10m(1mより大きい)に編集し、追加します

-I 10m

/etc/memcached.confに移動し、memcachedを再起動します

また、/ usr / lib / python2.7 / dist-packages / django / core / cache/backendsにあるmemcached.pyでこのクラスを次のように編集します。

class MemcachedCache(BaseMemcachedCache):
"An implementation of a cache binding using python-memcached"
def __init__(self, server, params):
    import memcache
    memcache.SERVER_MAX_VALUE_LENGTH = 1024*1024*10 #added limit to accept 10mb
    super(MemcachedCache, self).__init__(server, params,
                                         library=memcache,
                                         value_not_found_exception=ValueError)
于 2013-03-13T11:04:40.663 に答える
4

SERVER_MAX_VALUE_LENGTHまだコメントを追加することはできませんが、インポート時に を変更すると python-memcached が奇妙に動作するという同じ問題があったため、この問題に関する私の簡単な修正を共有したいと思いました。

さて、__init__FizxMike が提案する編集に加えて、同じクラスで _cache プロパティを編集することもできます。そうすることserver_max_value_lengthで、次のように明示的に渡す python-memcached クライアントをインスタンス化できます。

from django.core.cache.backends.memcached import BaseMemcachedCache

DEFAULT_MAX_VALUE_LENGTH = 1024 * 1024

class MemcachedCache(BaseMemcachedCache):
    def __init__(self, server, params):
        #options from the settings['CACHE'][connection]
        self._options = params.get("OPTIONS", {})
        import memcache
        memcache.SERVER_MAX_VALUE_LENGTH = self._options.get('SERVER_MAX_VALUE_LENGTH', DEFAULT_MAX_VALUE_LENGTH)

        super(MemcachedCache, self).__init__(server, params,
                                             library=memcache,
                                             value_not_found_exception=ValueError)

    @property
    def _cache(self):
        if getattr(self, '_client', None) is None:
            server_max_value_length = self._options.get("SERVER_MAX_VALUE_LENGTH", DEFAULT_MAX_VALUE_LENGTH)
            #one could optionally send more parameters here through the options settings,
            #I simplified here for brevity
            self._client = self._lib.Client(self._servers,
                server_max_value_length=server_max_value_length)

        return self._client

また、Django コードを編集する代わりに、BaseMemcachedCache を継承する別のバックエンドを作成して使用することも好みます。

参照用の django memcached バックエンド モジュールは次のとおりです: https://github.com/django/django/blob/master/django/core/cache/backends/memcached.py

このスレッドのすべてのヘルプに感謝します!

于 2014-01-23T15:33:24.120 に答える