gpt4 book ai didi

python - Google App Engine 内存使用率异常高

转载 作者:太空宇宙 更新时间:2023-11-04 06:24:13 25 4
gpt4 key购买 nike

我有一个 Python GAE 应用程序,它在每个实例中存储数据,内存使用率比我预期的要高得多。作为说明,考虑我添加到我的应用程序中的这个测试代码:

from google.appengine.ext import webapp

bucket = []

class Memory(webapp.RequestHandler):
def get(self):
global bucket
n = int(self.request.get('n'))
size = 0
for i in range(n):
text = '%10d' % i
bucket.append(text)
size += len(text)
self.response.out.write('Total number of characters = %d' % size)

使用查询变量 n 的值调用此处理程序将导致实例将 n 个字符串添加到其列表中,每个字符串长度为 10 个字符。

如果我用 n=1 调用它(以加载所有内容),然后检查生产服务器上的实例内存使用情况,我会看到 29.4MB 的数字。如果我然后用 n=100000 调用它并再次检查,内存使用量已跃升至 38.9MB。也就是说,我的内存占用量增加了 9.5MB,只存储了 100 万个字符,几乎是我预期的十倍。我相信每个字符只消耗一个字节,但即使这是错误的,还有很长的路要走。列表结构的开销肯定解释不了。我尝试添加一个显式垃圾收集调用,但数字没有改变。我错过了什么,有没有办法减少足迹?

(顺便说一句,我尝试使用集合而不是列表,发现在调用 n=100000 后内存使用量增加了 13MB。这表明 100000 个字符串的集合开销比列表多 3.5MB,这也比预期的要大得多。)

最佳答案

我知道我真的迟到了,但这一点也不奇怪......

考虑一个长度为 1 的字符串:

s = '1'

这很小,对吧?也许在 1 字节左右的某个地方?不。

>>> import sys
>>> sys.getsizeof('1')
38

因此,您创建的每个字符串大约有 37 个字节的开销(所有这些字符串方法都需要存储在某处)。

此外,对于您的 CPU 而言,基于“字长”而不是字节大小来存储项目通常是最有效的。在许多系统上,一个“字”是 4 个字节......)。我不确定,但如果 python 的内存分配器也在那里玩花样以保持它运行得相当快,我不会感到惊讶。

此外,不要忘记列表表示为过度分配的数组(以防止每次您 .append 时出现巨大的性能问题)。有可能,当您列出 100k 元素时,python 实际上会为 110k 或更多分配指针。

最后,关于 set —— 这可能很容易解释为 setlist 更过度分配(它们毕竟需要避免所有这些哈希冲突)。随着集合大小的增长,为了在数组中有足够的空闲槽以避免散列冲突,它们最终在内存使用中大幅跳跃:

>>> sys.getsizeof(set([1]))
232
>>> sys.getsizeof(set([1, 2]))
232
>>> sys.getsizeof(set([1, 2, 3]))
232
>>> sys.getsizeof(set([1, 2, 3, 4]))
232
>>> sys.getsizeof(set([1, 2, 3, 4, 5]))
232
>>> sys.getsizeof(set([1, 2, 3, 4, 5, 6])) # resize!
744

关于python - Google App Engine 内存使用率异常高,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546272/

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