2009-05-26 51 views
0

我有一個程序可以處理多個文件,併爲每個文件生成一個報告。報告生成部分是一個獨立的函數,它接受一個文件名,然後返回。在報告生成過程中,中間部分會緩存在內存中,因爲它們可能會用於報告的多個部分,以避免重新計算。Python MemoryError - 我如何強制刪除對象

當我在一個目錄中的所有文件上運行此程序時,它將運行一段時間,然後崩潰與MemoryError。如果我然後在同一個目錄中重新運行它,它將跳過所有成功創建報告的文件,然後繼續。它會在再次崩潰之前處理一些文件。

現在,在生成報告的方法調用之後,爲什麼並非所有資源都被清除,或者至少標記爲垃圾回收?沒有實例離開,並且我沒有使用任何全局對象,並且在每個文件處理之後,所有打開的文件都關閉。

有沒有辦法讓我確認沒有多餘的對象引用?有沒有辦法強制在Python中進行垃圾收集?

關於實現和緩存的更多細節。每個報告都有幾個元素,每個元素可以依賴於不同的計算,每個計算都可以依賴於其他計算。如果一個計算已經完成,我不想再做一次(其中大部分都很昂貴)。

下面是一個縮略版在緩存:

class MathCache: 
    def __init__(self): self.cache = {} 
    def get(data_provider): 
     if not data_provider.id in self.cache: 
      self.cache[data_provider.id] = data_provider.get_value(self) 
     return self.cache[data_provider.id] 

它的一個實例被創建,然後傳遞到報表中的每個元素。此實例僅保存在報告創建方法的本地參考中。

所有data_providers都從一個公共類繼承而來,該類用於根據散列構造函數參數和類名稱爲該實例創建唯一標識。我傳遞MathCache,因爲data_provider本身可能依賴於其他計算。

+0

多一點的代碼會有幫助。 「中間部分被緩存在內存中」是模糊的 - 可能是你的問題的原因。 Python具有優秀的垃圾收集。不知何故,你正在阻止這一點。 – 2009-05-26 11:37:00

回答