如何解決Python2的記憶體洩漏問題

2021-07-02 15:41:33 字數 1587 閱讀 4389

python程序記憶體撐大了下不去,只能手動重啟釋放記憶體,這麼坑爹的事情你遇到過嗎?哪家記憶體分配器強?結果一目了然。

線上程序目前都是使用原生的python記憶體分配器(pymalloc),在正常的情況下表現還算穩定,但如果來了一波類似於武神壇或者天下第一的比武大會,為手機瞬間帶來了10倍於平時的流量,一陣狂虐之後,python程序占用的記憶體被撐大就下不去了。關於python的記憶體不釋放問題,可以參考一下這兩篇文章:python記憶體不釋放原理,python memory management and tcmalloc。

為了解決記憶體洩漏的問題,我專門使用了三種編譯方式去編譯python2.7直譯器

以下分別使用pymalloc、without-pymalloc、tcmalloc測試1千萬個object的list記憶體釋放情況(注:預設使用python2.7)。

cpu4 qemu virtual cpu version 2.1.0

記憶體15g

作業系統核心

linux onlinegame-229-88 3.2.0-4-amd64 #1 smp debian 3.2.60-1+deb7u1 x86_64 gnu/linux

#!/usr/bin/env python

# coding: utf-8

import os

import gc

import time

class

test:

def__init__

(self):

self.name = "haha"

defrun

(): l =

begin = time.time()

for i in xrange(10000000):

end = time.time()

print

'cost:%s' %(round(end-begin,3))

input_str = raw_input('\nrun: ')

if __name__=="__main__":

print

"pid:%s" %os.getpid()

input_str = raw_input('\nstart')

run()

input_str = raw_input('\nready to collect')

gc.collect()

input_str = raw_input('\ncollected.')

\

pymalloc

without-pymalloc

tcmalloc

list物件數量

10000000

10000000

10000000

平均消耗時間

21.379s

21.199s

20.53s

run呼叫期間記憶體占用

3.6g

3.6g

3.6g

run結束後記憶體占用

2.7g

23m8224b

collect後的記憶體占用

2.7g

23m8224b

如何解決OSG記憶體管理問題?

osg是使用c 語言開發的,而該語言在動態記憶體管理方面做得並不好,經常需要程式設計師手動申請和釋放記憶體。這種靠人工管理記憶體的方式不僅繁瑣,而且極易造成記憶體洩漏,尤其在乙個中大型系統中,靠人工管理記憶體是一項艱鉅的任務。資料型別osg ref ptr 智慧型指標 在原始碼中隨處可見,它和另外一...

如何解決python爬蟲亂碼問題

直接上 import requests url html requests.get url text print html 輸出結果亂碼,可這是為什麼呢?很明顯是編碼問題造成的 import requests import sys 輸出我們編譯器所用的編碼 print sys.getdefaulte...

如何解決Python包依賴問題

以簡潔高效 指程式設計較為高效,而不是執行速度 出名的python,在包依賴問題上有時候讓人撓頭.一些新手複製了github上的專案準備執行,很多時候會在包依賴這一步上卡個半天.這裡推薦新手最好在基於linux的系統或者mac上,一些包 比如scrapy的win32相關依賴 可能無法直接通過包管理工...