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相關依賴 可能無法直接通過包管理工...