2017-01-30 63 views
0

我有一個非常大的XML文件,其中包含有關網絡設備的數據。每次程序迭代時,它都會修改一個network_device條目,同時保留文件的其餘部分。我試圖找到最有效的方式來:Python:最有效的方法來更新lxml中的XML文件?

  1. 添加新network_device的元素,並將其添加到現有的XML文件,而不完全重寫它(因爲我認爲是更爲資源密集型)
  2. 變化的現有的network_device元素也儘可能保持資源友好。

我到目前爲止看到的每個示例都將整個XML文件加載到ElementTree對象的內存中,編輯樹並將樹寫入文件。每個文件高達幾百兆字節,這是一個非常密集的過程。

我正在使用lxml庫來做到這一點,但如果有更好的東西,我不會堅持這個想法。


<main> 
<network_device updated="1/14/2017 10:02:45" checked="1/30/2017 18:55:30" hash="1cdf045c"> 
    <hostname>CNMASAS02</hostname> 
    <management_ip>10.1.1.1</management_ip> 
    <serials> 
     <serial type="ABCD1234" hardware="somehardware" serial="XYZ1234567890"/> 
     <boot></boot> 
    </serials> 
    <cdp_neighbors> 
     <neighbor added="1/14/2017 10:02:45" ip="10.2.2.2" hostname="somedevice" platform="cisco_ios"/> 
     <neighbor added="1/14/2017 10:02:45" ip="10.2.2.2" hostname="somedevice" platform="cisco_ios"/> 
    </cdp_neighbors> 
    <interfaces> 
    </interfaces> 
</network_device> 

<network_device updated="1/14/2017 10:02:45" checked="1/30/2017 18:55:30" hash="1frgd432"> 
    <hostname>CNMASAS03</hostname> 
    <management_ip>10.1.1.2</management_ip> 
    <error_code>#8: Could not access IP address to poll host.</error_code> 
</network_device> 
</main> 
+0

如果你想知道什麼是「最有效的」,你將不得不在不同的xml庫上運行你的樣本數據並做一些[基準測試](https://github.com/theMagicalKarp/python-xml-parsing-benchmark )。 – alfasin

回答

1

XML是文本格式,這意味着它是停留在與用於修飾的無空間連續的順序。因此,任何更新都必須涉及讀取文件,進行修改並寫出整個文件。改進這一點的唯一方法是使用xinclude或文檔實體分離出記錄。您仍可能需要閱讀整個文檔,但只能修改包含已更改節點的部分。 更多的編碼,但這往往是效率的代價。我正在研究一種二進制n維xml格式,對於像這樣的事情會更高效,但需要更多的代碼。

+0

感謝您的回覆。有沒有一種優越的,更高效的數據存儲格式可以推薦用於我的用例? – Wyko

+0

在這種情況下,我會使用SQL(可能是MySQL)。從SQL到XML的轉換對於輸出來說很容易,而格式對於修改非常有效。我傾向於將XML用於需要任意排序和/或複雜嵌套的小型數據集。 – Mike

相關問題