簡體   English   中英

如何實現內存密集型python腳本進行測試

[英]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文檔時, rangexrange在短距離之間幾乎沒有區別,但在大范圍內則存在顯着差異,引用了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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM