部署的輿情系統,內存變大,找原因。
一個小例子。
def func():
local_list = list(range(10000000))
func()
time.sleep(200)
能夠觀察到,在sleep 200秒的時間內,程序的內存一直是200多M,雖然是函數局部變量,執行后在外部無法使用了,但仍然占據大內存。
再來一個
global_list = list(range(10000000))
del global_list
time.sleep(200)
能夠觀察到,在sleep 200秒的時間內,程序的內存一直也是200多M,引用計數變為0,但仍然占據大內存。
引入gc模塊
在sleep之前插入 gc.collect()
查看內存,內存直接下降到10M內了,這是我期待的。
本篇的list代表一個巨大的內存的變量,以range(10000000)來指代。不要扯上什么xrange range,我就是要用這個來簡單指代一些巨大內存的變量。
實際過程中指代的是下載 上傳巨大的html源碼,爬蟲過程中如果遇到mp4 avi連接沒有過濾,下載了mp4的字符串就會是一個巨大的字符串。
之前有個地方,給njinx的網關接口上傳結果,發現一直被njinx拒絕,請求不成功,而程序中遇到這種情況,一直等待60秒一直重試,導致永遠不可能上傳,內存永遠降不下來。
下一篇介紹,監控內存和釋放內存。