言語:- 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 出身です。