..メモリpython側に巨大なオブジェクトをロードする代わりに、redisやmemcachedなどのキャッシュに適切なサービスを使用するのはどうですか?このようにして、辞書がさらに大きくなった場合に、追加のマシンでスケーリングすることもできます。
とにかく、100MBのメモリにはすべてのデータ+ハッシュインデックス+その他が含まれています。オーバーヘッド; 先日、Pythonプロセスを終了するまで、メモリの割り当てが解除されないことに気づきました(Pythonインタープリターから数ギガのメモリをいっぱいにして、巨大なjsonオブジェクトをロードしました。.:)); 誰かがその解決策を持っていれば面白いでしょう..
更新:メモリが非常に少ないキャッシュ
512MBのRAMのみを使用するオプションは次のとおりです。
そして、後者の2つのケースでは、オブジェクトを分割してみてください。そうすれば、キャッシュからメガバイトのオブジェクトを一度に取得することはありません。
更新:複数のキャッシュキーにまたがる怠惰なdict
キャッシュされたdictを次のようなものに置き換えることができます。このようにして、通常の辞書と同じように処理を続けることができますが、データは本当に必要な場合にのみキャッシュからロードされます。
from django.core.cache import cache
from UserDict import DictMixin
class LazyCachedDict(DictMixin):
def __init__(self, key_prefix):
self.key_prefix = key_prefix
def __getitem__(self, name):
return cache.get('%s:%s' % (self.key_prefix, name))
def __setitem__(self, name, value):
return cache.set('%s:%s' % (self.key_prefix, name), value)
def __delitem__(self, name):
return cache.delete('%s:%s' % (self.key_prefix, name))
def has_key(self, name):
return cache.has_key(name)
def keys():
## Just fill the gap, as the cache object doesn't provide
## a method to list cache keys..
return []
そして、これを置き換えます:
projects_map = cache.get('projects_map')
projects_map.get('search term')
と:
projects_map = LazyCachedDict('projects_map')
projects_map.get('search term')