expatパーサー:メモリ消費
-
19-08-2019 - |
質問
expatパーサーを使用して、約15 GBのXMLファイルを解析しています。問題は、<!> quot; Out of Memory <!> quot;をスローすることです。エラーが発生し、プログラムが中止されます。
expatパーサーで同様の問題に直面している人がいるかどうか、または既知のバグであり、それ以降のバージョンで修正されたかどうかを知りたいですか?
解決
expatを使用して大きなファイルを解析したことがありますが、問題はありませんでした。 expat DOMラッパーの1つではなく、SAXを使用していると仮定しています。 DOMを使用している場合、そこに問題があります-基本的にファイル全体をメモリにロードしようとしています。
XMLを解析するときにオブジェクトを割り当てていますか?それが私がチェックする最初の事でしょう。問題が本当にexpatにあるかどうかを確認する1つの方法-プログラムを空のタグハンドラーを持つ単純なバージョンに減らす(つまり、ファイルを解析するだけで結果が何もしない)場合、メモリが不足しますか?
他のヒント
expatはまったく知りませんが、何らかの理由でメモリに多くの状態を保持する必要があると思います。 XMLは何らかの形で形成されていますか?大きなブロックの終了タグにハンドラーを登録していますか?
大きなブロックの終わりに登録されたハンドラーがあり、expatがブロックをハンドラーに渡すと予想される場合、expatはそのブロックを完全に収集する前にメモリが不足する可能性があると考えています。私が言ったように、私は駐在員を知らないので、これは不可能かもしれない、私はただ尋ねている。
別の方法として、expatはメモリの損失がある場所であると確信していますか?データが非常に大きいため、またはコードのメモリリークが原因でメモリ不足状態が発生したため、XMLファイルのコンテンツに関する情報と独自のデータ構造を保持している状況を想像できます。
Expatは、大きなメモリ内構造を構築しないイベント駆動型のパーサーです。したがって、問題となるのはおそらくexpat(大きなファイルの解析に非常に広く使用されている)ではなく、おそらくあなた自身のコードです。
Expatにはリークがあります-長時間実行されているサーバーで使用を開始しましたが、パーサーが解放されているかどうかに関係なく、メモリが常にリークしていることがわかりました。 xmlparse.cの最新バージョンではこの問題は解決されず、既存のリークのみが非表示になります。