2009-03-18 16 views
0

私はexpatパーサーを使用して約15GBのXMLファイルを解析しています。問題は、 "メモリ不足"エラーをスローし、プログラムが異常終了することです。expatパーサー:メモリ消費

私は、expatパーサーで同様の問題に直面しているのか、それとも既知のバグであり、それ以降のバージョンで修正されたのか知りたいですか?

+0

どのプログラミング言語、どのパーサー? –

+0

C++とパーサーはexpatパーサー –

答えて

2

以前は大きなファイルを解析するためにexpatを使用しましたが、これまで問題はありませんでした。私は、expat DOMラッパーの1つではなくSAXを使用していると仮定しています。 DOMを使用している場合、それはあなたの問題です。本質的にメモリ全体にファイルをロードしようとしています。

XMLを解析するときにオブジェクトを割り当てていて、割り当てを解除していないのでしょうか?それが私が確認する最初のものです。問題が本当にexpatであるかどうかを調べる1つの方法 - 空のタグハンドラを持つ単純なバージョン(つまり、ファイルを解析して結果を何もしない)にプログラムを縮小すると、メモリが不足していますか?

+0

私はパースするのがとても新しいです。 SAXパーサー用に異なるAPIを用意していますか?使用されているAPIから、SAXパーサー、DOMパーサを使用しているかどうかを確認することはできません。 –

+0

SAXパーサーでは、 "begin_element"、 "end_endelement"、 "characters"などのメソッドを作成し、自分で状態を管理しますあなたが解析するときに。 DOMパーサーを使用すると、ドキュメント全体を一度に解析し、コード内のドキュメントツリーを「参照」することができます。 –

1

私はexpatをまったく知りませんが、何らかの理由でメモリに余りに多くの状態を保持しなければならないと思います。何らかの形でXML malが形成されていますか?大きなブロックの終了タグのハンドラが登録されていますか?

大きなブロックの最後に登録されたハンドラを持っていて、expatがそのブロックをハンドラに渡すことが予想される場合、expatはメモリを使い果たしてしまう可能性があります。ブロック。私が言ったように、私は外国人を知らないので、これは可能ではないかもしれません、私は尋ねています。

また、expatでメモリ損失が発生していることを確認してください。私は、データが非常に大きいか、コード内のメモリリークが原因でメモリ不足状態に陥ったために、XMLファイルの内容と自分のデータ構造について何らかの情報を保持している状況を想像することができます。

+0

実際に私は仮想メモリが2GBを超えています。ヒープ上に割り当てられたメモリは、仮想メモリのサイズのみを増加させますか? –

+0

sameer - 非常にネストされた要素が非常に多い場合、スタック領域が不足する可能性がありますが、ヒープスペースの問題はほぼ確実です。 –

+0

プロセス内のすべて(ヒープやスタック、プログラムなど)は、プロセスの仮想メモリフットプリントの一部です。ハンドラが登録されていない(または何かの開始時に1つだけ)ファイルを解析し、expatが失敗するかどうかを調べたいかもしれません。 –

1

Expatは、大きなメモリ内構造を構築しないイベントドリブンパーサーです。だからおそらくexpat(大規模なファイルを解析するために非常に広く使われている)が問題であり、おそらく自分のコードである可能性が高いです。

1

Expatにはリークがあります。長時間実行しているサーバーで使用するようになりました。パーサーが解放されているかどうかに関係なく、メモリが一貫して漏れていることがわかりました。より最近のバージョンのxmlparse.cではこの問題は解決されず、既存のリークだけが隠されます。