python– 加载导致内存峰值的字典对象

python– 加载导致内存峰值的字典对象,第1张

概述我有一个字典对象,有大约60,000个密钥,我在我的Django视图中缓存和访问.该视图提供了基本的搜索功能,我在字典中查找搜索词,如下所示:projects_map = cache.get('projects_map') projects_map.get('search term') 然而,只是抓住缓存的对象(在第1行)会导致服务器上的内存使用量大幅增加

我有一个字典对象,有大约60,000个密钥,我在我的Django视图中缓存和访问.该视图提供了基本的搜索功能,我在字典中查找搜索词,如下所示:

projects_map = cache.get('projects_map')projects_map.get('search term')

然而,只是抓住缓存的对象(在第1行)会导致服务器上的内存使用量大幅增加 – 有时超过100MB – 即使在返回值并呈现模板后内存也不会释放.

我怎样才能让记忆像这样抬起来?此外,我尝试在获取值后显式删除对象,但即使这样也不会释放内存峰值.

任何帮助是极大的赞赏.

更新:解决方案我最终实施

我决定实现自己的索引表,在其中存储密钥及其pi​​ckle值.现在,我使用:而不是在字典上使用get()

ProjectsIndex.objects.get(index_key =< search term>)

并取消价值.这似乎解决了内存问题,因为我不再将巨型对象加载到内存中.它为页面添加了另一个小查询,但这就是它.似乎是一个完美的解决方案……现在.

最佳答案..如何使用一些适当的缓存服务,如redis或memcached,而不是加载内存python端的巨大对象?这样,如果字典增长更多,你甚至可以扩展额外的机器.

无论如何,100MB内存包含所有数据哈希索引misc.高架;前几天我注意到很多次内存都没有被释放,直到你退出Python进程(我从Python解释器填充了几个内存,加载了一个巨大的Json对象.. :));如果有人有解决方案,这将是有趣的..

更新:内存很少的缓存

您只有512MB RAM的选项是:

>使用redis,看看这里http://redis.io/topics/memory-optimization(但我怀疑512MB还不够,甚至优化)
>使用单独的机器(或者由于memcached和redis都支持分片的集群)以更多的ram来保持缓存
>使用database cache backend,速度要慢得多,但内存消耗更少,因为它可以节省磁盘上的所有内容
>使用filesystem cache(虽然我没有看到更喜欢这个优于数据库缓存)

并且,在后两种情况下,尝试拆分对象,这样就不会一次从缓存中检索兆字节的对象.

更新:跨越多个缓存键的懒惰字典

你可以用这样的东西替换你的缓存的dict;这样,您可以像使用普通字典一样继续处理它,但只有在您确实需要时才会从缓存加载数据.

from django.core.cache import cachefrom UserDict import DictMixinclass 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')
总结

以上是内存溢出为你收集整理的python – 加载导致内存峰值的字典对象全部内容,希望文章能够帮你解决python – 加载导致内存峰值的字典对象所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1205470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存