私はexpatパーサーを使用して約15GBのXMLファイルを解析しています。問題は、「メモリ不足」エラーがスローされ、プログラムが異常終了することです。
ボディがエクスパットパーサーで同様の問題に直面しているのか、それとも既知のバグであり、後のバージョンで修正されているのかを知りたいですか?
私はexpatパーサーを使用して約15GBのXMLファイルを解析しています。問題は、「メモリ不足」エラーがスローされ、プログラムが異常終了することです。
ボディがエクスパットパーサーで同様の問題に直面しているのか、それとも既知のバグであり、後のバージョンで修正されているのかを知りたいですか?
私は以前にexpatを使用して大きなファイルを解析しましたが、問題はありませんでした。私はあなたがSAXを使用していて、expatDOMラッパーの1つではないと仮定しています。DOMを使用している場合、それが問題です。基本的に、ファイル全体をメモリにロードしようとします。
XMLを解析するときにオブジェクトを割り当てていて、割り当てを解除していない可能性がありますか?それが私が最初にチェックすることです。問題が本当にエクスパットにあるかどうかを確認する1つの方法-プログラムを空のタグハンドラーを持つ単純なバージョンに減らした場合(つまり、ファイルを解析し、結果には何もしません)、それでもメモリが不足しますか?
Expatにリークがあります-長時間実行しているサーバーで使用し始めましたが、パーサーが解放されているかどうかに関係なく、常にメモリリークが発生していることがわかりました。最近のバージョンのxmlparse.cはこの問題を解決せず、既存のリークを非表示にするだけです。
Expat は、大規模なメモリ内構造を構築しないイベント駆動型のパーサーです。したがって、問題はおそらく expat (大きなファイルの解析に非常に広く使用されている) ではなく、独自のコードである可能性が高いです。
私は外国人についてまったく知りませんが、何らかの理由でメモリにあまりにも多くの状態を保持する必要があると思います. XML の形式が間違っていますか? 大きなブロックの終了タグにハンドラを登録していますか?
大きなブロックの最後に登録されたハンドラーがあり、expat がブロックをハンドラーに渡すことが期待されている場合、expat はそのブロックを完全に収集する前にメモリ不足になる可能性があると考えています。私が言ったように、私は外国人を知らないので、これは不可能かもしれません.
または、expat が記憶喪失の場所であると確信していますか? データが非常に大きいか、コード内のメモリ リークが原因で、XML ファイルの内容と独自のデータ構造に関する情報を保持していて、メモリ不足の状態が発生した状況を想像できます。