0

多数の項目を含む 2 つの大きな XML ファイル (c.100MB) があります。それらの違いを出力したい。

各アイテムには ID があり、それが両方のファイルにあるかどうかを確認する必要があります。そうであれば、そのアイテムの個々の値を比較して、同じアイテムであることを確認する必要があります。

SAXパーサーはこれを解決する最良の方法ですか?また、どのように使用されますか? 私は要素ツリーとfindallを使用して小さなファイルで機能しましたが、今では大きなファイルでは機能しません。

srcTree = ElementTree()
srcTree.parse(srcFile)

# finds all the items in both files
srcComponents = (srcTree.find('source')).find('items')
srcItems = srcComponents.findall('item')
dstComponents = (dstTree.find('source')).find('items')
dstItems = dstComponents.findall('item')

# parses the source file to find the values of various fields of each
# item and adds the information to the source set
for item in srcItems:
  srcId = item.get('id')
  srcList = [srcId]
  details = item.find('values')
  srcVariables = details.findall('value')
  for var in srcVariables:
    srcList.append((var.get('name'),var.text))
srcList = tuple(srcList)
srcSet.add(srcList)
4

1 に答える 1

2

elementtreeをプルパーサー(saxなど)http://effbot.org/zone/element-pull.htm として使用できます。また、elementreehttp://effbot.org/zone/element-iterparseにはiterparse関数があり ます。 htm これらの両方を使用すると、すべてをメモリにロードせずに大きなファイルを処理できます。

しかし、saxは機能します(私は100MBよりはるかに大きいものを処理しました)が、今はelementtreeを使用してその仕事をします。

lxml(etree互換)を使用したインクリメンタル/イベントベースの解析もご覧くださいhttp://lxml.de/tutorial.html#event-driven-parsing

そして、ここに1GBを超えるファイルでのiterparseの使用に関する優れた記事がありますhttp://www.ibm.com/developerworks/xml/library/x-hiperfparse/

于 2012-07-30T11:10:31.783 に答える