gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 18:43:21 25 4
gpt4 key购买 nike

我有一个包含大约 60,000 个键的字典对象,我在 Django View 中缓存和访问这些键。该 View 提供了基本的搜索功能,我可以在其中查找字典中的搜索词,如下所示:

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

然而,仅仅抓取缓存的对象(在第 1 行)会导致服务器上的内存使用量激增 - 有时超过 100MB - 并且即使在返回值并呈现模板之后内存也不会释放。

我怎样才能防止内存像这样顶起来?此外,我尝试在获取值后显式删除该对象,但即使这样也不会释放内存峰值。

任何帮助是极大的赞赏。

更新:我最终实现的解决方案

我决定实现我自己的索引表,在其中存储键和它们的腌制值。现在,而不是使用 get()在字典上,我使用:
ProjectsIndex.objects.get(index_key=<search term>)
并解开值(value)。这似乎解决了内存问题,因为我不再将巨大的对象加载到内存中。它向页面添加了另一个小查询,但仅此而已。似乎是完美的解决方案......现在。

最佳答案

..使用一些合适的服务进行缓存怎么样,比如redismemcached而不是在内存python端加载巨大的对象?这样,如果字典增长更多,您甚至可以在额外的机器上扩展。

无论如何,100MB 内存包含所有数据 + 哈希索引 + 杂项。高架;前几天我注意到自己很多时候内存不会被释放,直到你退出 Python 进程(我从 Python 解释器填充了几场内存,加载了一个巨大的 json 对象..:));如果有人有解决方案,那将会很有趣..

更新:用很少的内存缓存

只有 512MB 内存的选项是:

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

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

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

    你可以用这样的东西替换你缓存的字典;这样,您可以继续像使用普通字典一样处理它,但是只有在您真正需要时才会从缓存中加载数据。
    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')

    关于python - 加载字典对象导致内存峰值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13188036/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com