我有一個相當大的 xml 檔案和相對較少的記憶體。在決議檔案時,我目前正在將整個檔案加載到記憶體中,如下面的代碼片段所示,這會減慢整個計算機的速度,有時甚至無法作業。我想知道是否有辦法一次只將一個專案加載到記憶體中?當正在處理當前檔案的同時加載下一個檔案時,也許使用一些像深度學習中的多處理。
root = ET.parse("my_file.xml").getroot()
for child in root:
do_something()
uj5u.com熱心網友回復:
在整個etree檔案中只有一次提到“記憶體”這個詞,它是在iterparse()的背景關系中沒有將整個 XML 讀入記憶體:
如果您不介意應用程式阻塞讀取 XML 資料,但仍希望具有增量決議功能,請查看 iterparse()。當您正在閱讀大型 XML 檔案并且不想將其完全保存在記憶體中時,它會很有用。
但是,檔案沒有顯示如何使用 iterparse 的任何示例。PyMOTW 3對整個 etree 模塊有很好的描述,并包含一個 iterparse 的示例。
如果沒有更多關于做什么的背景關系do_something(),對您來說最簡單的實作如下所示:
from xml.etree import ElementTree as ET
for _, elem in ET.iterparse('input.xml'):
do_something(elem)
uj5u.com熱心網友回復:
使用該.iterparse功能。以增量方式決議大型 XML 檔案。這適用于不需要將整個檔案加載到記憶體中的大型 XML 檔案。
從檔案中:
xml.etree.ElementTree.iterparse(源,事件=無,決議器=無)
將 XML 部分逐步決議為元素樹,并向用戶報告正在發生的事情。source 是包含 XML 資料的檔案名或檔案物件。events 是要報告的一系列事件。支持的事件是字串、、、、
"start"和"end"("comment"“"pi"ns ”事件用于獲取詳細的命名空間資訊)。如果省略events,則僅報告事件。parser 是一個可選的決議器實體。如果未給出,則使用標準 XMLParser 決議器。parser 必須是 XMLParser 的子類,并且只能使用默認 TreeBuilder 作為目標。回傳提供 (event, elem) 對的迭代器。"start-ns""end-ns""end"
這是一個阻塞函式,所以它不是異步的。如果您同時有多個 XML 閱讀器:
請注意,雖然
iterparse()以增量方式構建樹,但它會阻止對源(或其命名的檔案)的讀取。因此,它不適合無法進行阻塞讀取的應用程式。有關完全非阻塞決議,請參閱XMLPullParser。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/411826.html
標籤:
上一篇:公共識別符號、系統識別符號和基本系統識別符號在XML中指的是什么?
下一篇:未找到元素“”的宣告
