私は大きなファイル (>9GB) を解析しており、Python で lxml の iterparse を使用してファイルを解析しながらクリアしながら進めています。疑問に思っていたのですが、クリア中に逆方向に解析する方法はありますか? これを lxml とは別に実装する方法はわかりましたが、このパッケージを使用すると便利です。
前もって感謝します!
はいといいえ...
「最後から」逆に開始するための「簡単な」解決策があります。しかし、最後まで行き、途中で「参照をクリア」して読み取りを最適化する逆イテレータがあります。
アプローチ 1: ファイルをその構造とノードで分割して、必要なものだけを解析できるようにします。
アプローチ 2: [1] で解析する「スマートな」方法を確認する
私の場合に私がしたこと。12 GB ファイルのデータが最後の 2 GB にある可能性があることは以前から知っていました。そこで、unix コマンドを使用してファイルを分割し、最後のファイルのみを処理します。
(これは醜いハックですが、私の場合はシンプルで十分に速く動作しました.tailも使用できますが、他のファイルもアーカイブしたいです)
--> 実際の Python マスターは file.seek() を使用しますが、UNIX コマンドの方が速いと思いました
今、私は 2 番目のアプローチを使用します [1]
[1] - http://www.ibm.com/developerworks/xml/library/x-hiperfparse/
xml の構造を理解するのに苦労しました。
iterparse()
厳密にフォワードのみです、私は恐れています。ツリーを逆方向に読み取りたい場合は、逆方向に解析しやすい形式で中間ストア(メモリ内またはディスク上)に書き込みながら、逆方向に読み取る必要があります。その後、ツリーを読み取ります。 。XMLをバックツーフロントで解析できるストリームパーサーを私は知りません。
私の頭のてっぺんから、2つのファイルを使用できます。1つはデータを含み、もう1つはデータファイル内のレコードへのオフセットのインデックスです。これにより、一度書き込まれると、逆方向の読み取りが比較的簡単になります。