我已經使用了Python一段時間,並不時遇到一些內存爆炸問題。我搜索了一些資料,以解決我的問題,如 Memory profiling embedded python 和 https://mflerackers.wordpress.com/2012/04/12/fixing-and-avoiding-memory-leaks-in-python/ 和 https://docs.python.org/2/reference/datamodel.html#object.del然而,他們沒有爲我工作。嵌入式功能的Python內存爆炸
我目前的問題是使用嵌入式函數時內存爆炸。下面的代碼工作正常:
class A:
def fa:
some operations
get dictionary1
combine dictionary1 to get string1
dictionary1 = None
return *string1*
def fb:
for i in range(0, j):
call self.fa
get dictionary2 by processing *string1*
# dictionary1 and dictionary2 are basically the same.
update *dictionary3* by processing dictionary2
dictionary2 = None
return *dictionary3*
class B:
def ga:
for n in range(0, m):
call A.fb # as one argument is updated dynamically, I have to call it within the loop
processes *dictoinary3*
return something
的問題時,我發現我並不需要dictionary1結合到字符串1,我可以直接通過dictionary1到A.fb.惹人我以這種方式實現它,然後程序變得非常慢並且內存使用量爆炸超過10次。我已經驗證這兩種方法都返回了正確的結果。
有人可能會提出爲什麼這樣一個小修改會導致如此之大的差異?
此前,我還在平坦化多源樹中的節點(具有100,000個以上節點)時注意到這一點。如果我從源節點(可能具有最大高度)開始平坦化,則內存使用率比可能具有最小高度的源節點的內存使用率差100倍。平均化時間大致相同。
這讓我很困惑。提前感謝你!
如果有人有興趣,我可以通過電子郵件發送給您更詳細的解釋源代碼。
基於我在數據結構和算法方面的教育知識,我完全同意你的看法。我不明白的是,通過消除組合,然後分離進程,我將獲得CPU時間或內存使用方面的改進,但是,它們都變得更糟...... – user186927
我們可以推測 - 但它不會生產力。最好嘗試使用分析器來了解性能差異。 – alfasin
嗨,alfasin,我找出了原因。最後是因爲在修改實現後,某些數據格式並不完全相同。該計劃花了很多時間來區分它們。感謝您提醒我使用分析器! – user186927