0
我正在尋找一種方法來處理使用高內存程序來重載RAM和CPU ......我想處理文件中包含的大量數據。然後我讀取這些文件並處理其中的數據。問題是存在許多嵌套for循環,並且根據處理的所有數據創建根XML文件。 該程序在運行時間半小時左右後很容易消耗一些內存。 有什麼我可以做的,不要讓RAM變得如此之大和/或解決它..?Python和內存消耗
我正在尋找一種方法來處理使用高內存程序來重載RAM和CPU ......我想處理文件中包含的大量數據。然後我讀取這些文件並處理其中的數據。問題是存在許多嵌套for循環,並且根據處理的所有數據創建根XML文件。 該程序在運行時間半小時左右後很容易消耗一些內存。 有什麼我可以做的,不要讓RAM變得如此之大和/或解決它..?Python和內存消耗
您是否真的需要將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速度更快。
- 花時間做簡單的基準測試。在處理數百萬條記錄時,小的差異會加起來,而且哪種方法最有效率並不總是很明顯。
如果您需要進行數據的複雜的操作,你爲什麼不只是把它放在一個關係型數據庫,並從那裏對數據進行操作?這將會有更好的表現。
那麼,我並不是一下子讀取XML,而是從文本文件中找到數據並從數據中創建一個XML文件......所以XML的生成發生在內存中 – user233864 2010-03-02 03:43:17
@ developerjay:創建過程是一樣的,你可以不時地反覆寫入磁盤,以避免在任何時候都在內存中擁有完整的文件。它會慢一點,但你會用更少的內存。 – voyager 2010-03-02 03:45:41
你會推薦什麼庫來做到這一點? LXML/cElementTree?我認爲,當我需要知道數據需要放置在XML方案中的位置時,迭代地只寫一些部分到文件是一項任務。基本上,你怎麼能一次寫一些數據,仍然保持XML模式......你推薦一個SAX處理程序/生成器,它只需要一個字符串來代替? – user233864 2010-03-02 04:37:37