1

言語:- Python 2.7.6

ファイルサイズ:- 1.5 GB

XML 形式

<myfeed>
    <product>
        <id>876543</id>
        <name>ABC</name>
        ....
     </product>

    <product>
        <id>876567</id>
        <name>DEF</name>
        ....
     </product>

    <product>
        <id>986543</id>
        <name>XYZ</name>
        ....
     </product>

私はしなければならない

A) すべてのノードを読み取る<product>

B) これらのノードの一部を削除します (<id>属性のテキストが python set() にある場合)

C) いくつかのノードを更新/変更します (<id>属性のテキストが python dict にある場合)

D)いくつかの新しいノードを追加/書き込みます

問題は、私の XML ファイルが巨大であることです (約 1.5 GB )。私はいくつかの調査を行い、これらすべての目的に lxml を使用することにしました。

iterparse() を element.clear() と一緒に使用してこれを達成しようとしています。これは、すべてのメモリを消費しないためです。

for event, element in etree.iterparse(big_xml_file,tag = 'product'):
        for child in element:
            if child.tag == unique_tag:
                if child.text in products_id_hash_set_to_delete: #python set()
                    #delete this element node

                else:
                    if child.text in products_dict_to_update:
                        #update this element node  
                        else:
                            print child.text
        element.clear()

注:- XML ファイルの 1 回のスキャンでこれら 4 つのタスクをすべて達成したい

質問

1) ファイルの 1 回のスキャンでこれらすべてを達成できますか?

2) はいの場合、処理中の要素ノードを削除および更新する方法を教えてください。

3) 代わりに tree.xpath() を使用する必要がありますか? はいの場合、1.5 GB のファイルにどれくらいのメモリが消費されるか、または iterparse() と同じように機能しますか?

私はPythonの経験があまりありません。私は Java 出身です。

4

1 に答える 1