[英]How to implement a memory intensive python script for test
我已將cgroups規則應用於特定用戶,並且我想測試從上述用戶運行的程序的內存是否受到限制。 我嘗試使用以下腳本:
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服務均打開和關閉時從未更改:
$ 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
在這種情況下,總內存為62GB,因此其中的4.8%約為3GB。 我將此限制設置為4GB,而該用戶未運行任何其他進程。
那么有人可以給我關於這個有問題的python腳本的一些想法嗎? 提前致謝。
如果要查看cgroup是否有效,只需將限制設置為100MB,然后嘗試啟動腳本。 關鍵不是要看一個較大的限制比一個較小的限制是好還是壞-您只想確保強制實施一個限制即可。 為此,一個小的限制就足夠了。
為了確保dict
按預期增長,您可以使用以下問題的答案來打印dict
的大小: Python中字典的內存使用情況?
我玩了一些你的劇本,盡管它很慢,但它一直在增長。 瓶頸是使用random.choice
。 如果您想快速填充內存,則產生隨機性會對您不利。 因此,僅使用固定字符串確實會很快耗盡內存。 如果使用以下內容,則想觀察它的增長情況時,可能會在print
后拋出time.sleep()
:
if __name__ == '__main__':
d = {}
i = 0;
for i in range(0, 100000000):
d[i] = 'A'*1024
if i % 10000 == 0:
print(i)
更快地填充內存:
只是一線:
['A'*1024 for _ in xrange(0, 1024*1024*1024)]
range
在內存中構造一個列表,然后循環循環通過它, xrange
創建一個生成器,該生成器是一個對象,該對象像序列一樣提供循環,但不在內存中構建該序列。 引用Python文檔時, range
和xrange
在短距離之間幾乎沒有區別,但在大范圍內則存在顯着差異,引用了Python文檔: https : //docs.python.org/2/library/functions.html#xrange
在Python 3中, xrange
提供的功能成為內置范圍的默認功能。 因此, xrange
上Python 2中xrange
固有的內存優勢,我已經看到Python 2到3兼容層將Python 2 range
函數映射為在xrange
調用xrange
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.