2015-01-16 43 views
1

我已經使用了Python一段時間,並不時遇到一些內存爆炸問題。我搜索了一些資料,以解決我的問題,如 Memory profiling embedded pythonhttps://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倍。平均化時間大致相同。

這讓我很困惑。提前感謝你!

如果有人有興趣,我可以通過電子郵件發送給您更詳細的解釋源代碼。

回答

0

您解決同一問題的事實不應該暗示該解決方案的效率。排序數組可能會出現同樣的問題:您可以使用冒泡排序O(n^2)或合併排序O(nlogn),或者,如果您可以應用某些限制,則可以使用非比較排序算法,如具有線性運行時的基數或桶排序算法。

從不同節點開始遍歷將產生遍歷圖的不同方式 - 其中一些可能無效(多次重複節點)。

至於「組合字典1到字符串1」 - 它可能是一個非常昂貴的操作,並且由於此函數被遞歸調用(多次) - 性能可能會非常差。但這只是一個受過教育的猜測,如果沒有關於在這些功能中執行操作的複雜性的更多細節,就無法回答。

+0

基於我在數據結構和算法方面的教育知識,我完全同意你的看法。我不明白的是,通過消除組合,然後分離進程,我將獲得CPU時間或內存使用方面的改進,但是,它們都變得更糟...... – user186927

+0

我們可以推測 - 但它不會生產力。最好嘗試使用分析器來了解性能差異。 – alfasin

+0

嗨,alfasin,我找出了原因。最後是因爲在修改實現後,某些數據格式並不完全相同。該計劃花了很多時間來區分它們。感謝您提醒我使用分析器! – user186927