2011-07-12 18 views
1

私は現在xml.dom.minidomという大きなxmlファイルを作成してから、toprettyxmlでファイルに書き出します。私はメモリエラーが発生しているので、XMLをドキュメントにストリーミングする方法はありますか?HDI:大きな文字列xmlをファイルに書き込む(python xml.dom.minidom)

def run(self): 
    while True: 
     domain = self.queue.get() 
     try: 
      conn = boto.connect_sdb(awsa, awss) 
      sdbdomain = conn.get_domain(domain) 
      s3conn = boto.connect_s3(awsa, awss) 
      archbucket = s3conn.get_bucket("simpledbbu") 
      doc = None 
      doc = Document() 
      root = doc.createElement("items") 
      doc.appendChild(root) 
      countermax = 0 
      counter = 0 
      for item in sdbdomain: 
       node = doc.createElement("item") 
       node.setAttribute("itemName", item.name) 
       for k,v in item.items(): 
        if not isinstance(v, basestring): 
         i = 0 
         for val in v: 
          node.setAttribute("{0}::{1}".format(k,i),val) 
          i += 1 
        else: 
         node.setAttribute(k,v) 
       root.appendChild(node) 
      k = Key(archbucket) 
      k.key = "{0}/{1}.xml".format(datetime.date.today().strftime("%Y%m%d"),sdbdomain.name) 
      #x = doc.toprettyxml(indent=" ") 
      f = open(domain + ".xml", "w") 
      f.truncate() 
      f.write(doc.toprettyxml(indent=" ")) 
      f.close() 
      #k.content_type.encode('ascii') 
      k.set_contents_from_filename(f.name) 
      os.remove(os.path.join(os.getcwd(),f.name)) 
     except: 
      print "failed to load domain: {0}".format(domain) 
      print formatExceptionInfo() 
     finally: 
      self.queue.task_done() 

答えて

1

xml.dom.minidomでは持つ大規模なXMLファイルを構築し、その後toprettyxml経由でファイルに書き出します。

メモリが不足している場合は、おそらくその動作を停止する必要があります。

簡単な文字列操作でXMLを構築できます。

with open(domain + ".xml", "w") as f: 
    f.write("<?xml...") 
    f.write("<items>") 
    for item in sdbdomain: 
     buffer= [] 
     for k,v in item.items(): 
      if not isinstance(v, basestring): 
      for i, val in enumerate(v): 
       txt= '{0}::{1}="{2}"'.format(k,i,val) 
      else: 
      txt= '{0}="{1}"'.format(k,v) 
      buffer.append(txt) 
     f.write(" <item {0}/>\n".format(" ".join(buffer))) 
    f.write("</items>") 
k= ................  
k.set_contents_from_filename(f.name) 

大規模なDOMオブジェクトをメモリに作成することなくXMLを一時ファイルに書き込むことができるようなものがあります。

+0

はい、ちょうどxmlを書き出します。単純なxmlです。ありがとうございます –

+0

@Chris:* writing *に関しては、すべてのXMLは単純です。 DOMモデルは、作成よりも解析のためのものです。 –

関連する問題