2

私はこの形式の大きなxmlファイル(約84MB)を持っています:

<books>
    <book>...</book>
    ....
    <book>...</book>
</books>

私の目標は、すべての本を抽出してそのプロパティを取得することです。私はそれを(他のxmlファイルで行ったように)次のように解析しようとしました:

from xml.dom.minidom import parse, parseString

fd = "myfile.xml"
parser = parse(fd)
## other python code here

しかし、コードは解析命令で失敗するようです。なぜこれが起こっているのですか、どうすればこれを解決できますか?

ファイルにはギリシャ語、スペイン語、アラビア語の文字が含まれている可能性があることを指摘しておく必要があります。

これは私がipythonで得た出力です:

In [2]: fd = "myfile.xml"

In [3]: parser = parse(fd)
Killed

実行中にコンピュータがフリーズすることを指摘したいので、これは以下のようにメモリ消費に関係している可能性があります。

4

3 に答える 3

7

より使いやすいlxmlを試してみてください。

#!/usr/bin/env python
from lxml import etree

with open("myfile.xml") as fp:
    tree = etree.parse(fp)
    root = tree.getroot()

    print root.tag

    for book in root:
        print book.text
于 2012-12-29T13:09:02.580 に答える
6

ここでSAXパーサーを使用することを強くお勧めします。minidom数メガバイトを超えるXMLドキュメントでの使用はお勧めしません。サイズが約10MBのXMLドキュメントで約400MBのRAM読み取りを使用しているのを見てきました。あなたが抱えている問題は、minidomあまりにも多くのメモリを要求することによって引き起こされているのではないかと思います。

PythonにはXMLSAXパーサーが付属しています。使用するには、次のようにします。

from xml.sax.handlers import ContentHandler
from xml.sax import parse

class MyContentHandler(ContentHandler):
    # override various ContentHandler methods as needed...


handler = MyContentHandler()
parse("mydata.xml", handler)

ContentHandlerサブクラスは、ContentHandlerのさまざまなメソッド(、、、、、など)をオーバーライドします。これら、SAXパーサーstartElementがXMLドキュメントを読み取るときに生成されるイベントを処理します。startElementNSendElementendElementNScharacters

SAXは、DOMよりもXMLを処理するための「低レベル」の方法です。ドキュメントから関連データを引き出すことに加えて、ContentHandlerは、現在内部にある要素を追跡する作業を行う必要があります。ただし、利点として、SAXパーサーはドキュメント全体をメモリに保持しないため、自分よりも大きいサイズを含む、潜在的に任意のサイズのXMLドキュメントを処理できます。

このサイズのXMLドキュメントでlxmlなどのDOMパーサーを使用することは他に試していませんが、lxmlはまだかなりの時間がかかり、XMLドキュメントの解析にかなりの量のメモリを使用するのではないかと思います。コードを実行するたびに、84MBのXMLドキュメントでコードが読み取られるのを待たなければならない場合、開発が遅くなる可能性があります。

最後に、あなたが言及したギリシャ語、スペイン語、アラビア語の文字が問題を引き起こすとは思わない。

于 2012-12-29T13:49:59.683 に答える
3

XMLパーサーには2種類あります(これはすべての言語に適用されます)。

  1. DOM解析(これはあなたが使用しているものです)。このタイプでは、XMLファイル全体がメモリ構造に読み込まれ、メソッドによってアクセスされます。

  2. SAX解析。これは、XMLの各部分を段階的に読み取る解析アルゴリズムです。この手法により、エラーをより適切に検出して処理できるようになります。

一般に、DOMはSAXよりも簡単です。これは、多くの詳細がネイティブメソッドによって処理されるためです。

SAX解析がXMLドキュメントのウォーク中に「実行」されるメソッドをコーディングする必要があるため、SAXはもう少し難しい問題です。

于 2012-12-29T13:03:48.653 に答える