首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现内存密集型python脚本进行测试

如何实现内存密集型python脚本进行测试
EN

Stack Overflow用户
提问于 2015-05-28 22:21:40
回答 3查看 3.2K关注 0票数 7

我已经对一个特定用户应用了cgroups规则,并且我想测试从上面的用户运行的程序的内存是否像预期的那样受到了限制。我尝试使用以下脚本:

代码语言:javascript
运行
复制
import string
import random

if __name__ == '__main__':
    d = {}
    i = 0;
    for i in range(0, 100000000):
        val = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(200)) # generate ramdom string of size 200
        d[i] = val
        if i % 10000 == 0:
            print i

当我通过ps命令监视进程时,发现%MEM增加到4.8,并且在两个cgroups服务打开和关闭时都不会改变:

代码语言:javascript
运行
复制
$ ps aux | grep mem_intensive.py
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
jason    11531 88.5  4.8 3312972 3191236 pts/0 R+   22:16   0:07 python mem_intensive.py

在此场景中,总内存为62 3GB,因此4.8%的内存约为3 3GB。我将限制设置为4 4GB,没有在此用户上运行任何其他进程。

那么,谁能给我一些关于这个有问题的python脚本的想法?提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2015-05-29 17:40:13

我使用过您的脚本,它一直在增长,尽管速度很慢。瓶颈是使用random.choice。如果你想快速填满内存,生成随机性对你不利。因此,仅使用固定字符串会相当快地耗尽内存。如果使用下面的代码,同时想看看它是如何增长的,那么您可能会在print之后抛出一个time.sleep()

代码语言:javascript
运行
复制
if __name__ == '__main__':
    d = {}
    i = 0;
    for i in range(0, 100000000):
        d[i] = 'A'*1024
        if i % 10000 == 0:
            print(i)

更快地填充内存:

只有一句话:

代码语言:javascript
运行
复制
['A'*1024 for _ in xrange(0, 1024*1024*1024)]
票数 3
EN

Stack Overflow用户

发布于 2015-05-29 15:38:29

如果您想查看cgroup是否有效,只需将限制设置为100MB并尝试启动脚本即可。重点并不是看一个大的限制比一个小的限制效果好还是差--你只想确保一个限制是强制的。为此,一个小的限制就足够了。

为了确保dict按预期增长,您可以使用以下问题的答案打印它的大小:Memory-usage of dictionary in Python?

票数 2
EN

Stack Overflow用户

发布于 2015-05-29 10:40:53

range在内存中构建了一个列表,然后循环遍历,xrange创建了一个生成器,该生成器是一个对象,它像序列一样为循环提供数据,但不会在内存中构建该序列。rangexrange在短距离上几乎没有区别,但在大范围上有显著差异,引用Python文档:https://docs.python.org/2/library/functions.html#xrange

在Python3中,xrange提供的功能成为内置范围的默认功能。由于这一点,以及Python2中xrange固有的内存优势,我已经看到Python2到3兼容层将Python2的range函数映射为在幕后调用xrange

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30509322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档