2010-03-02 151 views
0

我正在尋找一種方法來處理使用高內存程序來重載RAM和CPU ......我想處理文件中包含的大量數據。然後我讀取這些文件並處理其中的數據。問題是存在許多嵌套for循環,並且根據處理的所有數據創建根XML文件。 該程序在運行時間半小時左右後很容易消耗一些內存。 有什麼我可以做的,不要讓RAM變得如此之大和/或解決它..?Python和內存消耗

回答

3

您是否真的需要將XML文件的全部數據一次保存在內存中?

大多數(所有?)XML庫在那裏允許你do iterative parsing,這意味着你keep in memory just a few nodes of the XML file,not the whole file。這是除非你沒有任何庫的情況下自己創建一個包含XML文件的字符串,但這有點瘋狂。如果是這樣,請儘快使用庫。

具體的代碼示例介紹here可能不適用於你的項目,但考慮幾個原則傳播通過檢測出和lxml文件,當遇到以GB或更多的測量XML數據:

  • 使用迭代解析策略來逐步處理大型文檔。
  • 如果需要按隨機順序搜索整個文檔,請移至索引的XML數據庫。
  • 在您選擇的數據中保持非常保守的地位。如果您只對特定節點感興趣,請使用通過這些名稱選擇的方法。如果您需要謂詞語法,請嘗試使用可用的XPath類和方法之一。
  • 考慮手頭的任務和開發人員的舒適程度。當速度不是考慮因素時,諸如lxml的對象化或Amara等對象模型對Python開發人員來說可能更自然。僅需要解析時,cElementTree速度更快。
  • 花時間做簡單的基準測試。在處理數百萬條記錄時,小的差異會加起來,而且哪種方法最有效率並不總是很明顯。

如果您需要進行數據的複雜的操作,你爲什麼不只是把它放在一個關係型數據庫,並從那裏對數據進行操作?這將會有更好的表現。

+0

那麼,我並不是一下子讀取XML,而是從文本文件中找到數據並從數據中創建一個XML文件......所以XML的生成發生在內存中 – user233864 2010-03-02 03:43:17

+0

@ developerjay:創建過程是一樣的,你可以不時地反覆寫入磁盤,以避免在任何時候都在內存中擁有完整的文件。它會慢一點,但你會用更少的內存。 – voyager 2010-03-02 03:45:41

+0

你會推薦什麼庫來做到這一點? LXML/cElementTree?我認爲,當我需要知道數據需要放置在XML方案中的位置時,迭代地只寫一些部分到文件是一項任務。基本上,你怎麼能一次寫一些數據,仍然保持XML模式......你推薦一個SAX處理程序/生成器,它只需要一個字符串來代替? – user233864 2010-03-02 04:37:37