2014-02-15 65 views
1

我正在將大塊數據從數據庫寫入到XML文件。我使用Python和它的lxml庫來創建文件。 我注意到它是在內存中生成整個XML文件,然後輸出到文件的最後,有沒有辦法爲每X個數據庫對象轉儲xml文件?使用Python連續寫入輸出文件lxml

import lxml.etree as etree 
import os 

root = etree.Element('root') 
db_obj1 = etree.SubElement(root, 'item') 
db_obj2 = etree.SubElement(root, 'item') 
db_obj3 = etree.SubElement(root, 'item') 
et = etree.ElementTree(root) 
et.write(sys.stdout) 

我試着ElemenTree()。​​write()方法,但無法找到如何在http://lxml.de/api/lxml.etree._ElementTree-class.html做到這一點的文檔中的任何設置或最佳實踐。

尋求減少總內存佔用量。

+0

爲什麼要將數據庫轉儲爲XML?您可能會考慮寫入更自然的矩形格式,如CSV或HDF5或其他可以完全避免此問題的格式,以及爲磁盤上的數據提供更具空間效率和規則的格式。 –

+0

與傳統系統@JohnZwinck集成,無法更改此設置。 – Niklas9

回答

3

the lxml docs

它是有一個或多個嵌套元件()塊, 然後生成在循環內存中XML子樹(使用了ElementTree API的常見圖案,生成器API,XSLT或其他)將它們依次寫入 XML文件。這樣,它們可以在構建後立即從 內存中刪除,這樣可以大大減少應用程序的內存佔用量,同時保持整體生成的簡單,安全和正確。 [強調我的]。

filename = "/tmp/somefile.xml" 
with ET.xmlfile(filename, encoding='utf-8') as xf: 
    xf.write_declaration(standalone=True) 
    xf.write_doctype('<!DOCTYPE root SYSTEM "some.dtd">') 
    with xf.element('root'): 
     for value in '123': 
      # construct a really complex XML tree 
      el = ET.Element('item', attr=value) 
      xf.write(el) 
      # no longer needed, discard it right away! 
      el = None 

寫道

<?xml version='1.0' encoding='utf-8' standalone='yes'?> 
<!DOCTYPE root SYSTEM "some.dtd"> 
<root><item attr="1"/><item attr="2"/><item attr="3"/></root> 

到文件中。