2010-12-29 14 views
3
java.lang.OutOfMemoryError 
at com.solvoterra.xmlengine.Element.<init>(Element.java:9) 
at com.solvoterra.xmlengine.XML_Handler_Main.startElement(XML_Handler_Main.java:71) 
at org.apache.harmony.xml.ExpatParser.startElement(ExpatParser.java:146) 
at org.apache.harmony.xml.ExpatParser.append(Native Method) 
at org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:505) 
at org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:492) 
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:308) 
at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:264) 
at com.solvoterra.xmlengine.Project_Man.readXML_File(Project_Man.java:148) 
at com.solvoterra.xmlengine.Project_Man.run(Project_Man.java:83) 
at java.lang.Thread.run(Thread.java:1102) 

私はこの情報があったように私はすべての詳細を知らないだけでSAXに関数を含む新しいプロセスがメモリにXMLファイルを解析して実行しながら、エラーが発生しました。このことから(RAM)を見ることができます市場の匿名ユーザーによって提供されます。のOutOfMemoryError

Parseへの関数がすべてのバッファと呼ばれる前に、既存のデータがメモリから消去されます。

Q:HUGE XMLデータベースをメモリにパースしようとしていて、携帯電話で割り当てられたRAMだけではデータベースを処理できない可能性がありますか?

+0

おそらく、sqliteデータベースの使用を検討し、XMLを解析するのではなく、その内部のクエリを参照することを検討する必要がありますか? – ykatchou

+0

あなたが見るXMLエディタを書いています。 –

答えて

1

Saxの解析方法では、(DOMとは対照的に)メモリ自体にはロードされません。 SAXによって生成されたイベントを処理するあなたのやり方だけがメモリ過負荷を引き起こす可能性があります。

は、あなたのユーザーが自由にXMLソースを選択することができた場合は、どちらかする必要があります。

  • はBDに保存する解析アルゴリズムを構築したり、一度に解析する一つの要素の結果を提出
  • XMLソースの最初のX要素をロードする構文解析アルゴリズムを構築し、要求されたときに次の要素を取得できるようにします(ページ区切り)
  • XMLソースの長さを解析してから、小さなソースをロードする彼

このOutOfMemoryErrorのもう1つの理由は、XMLパーサーに関連していないアプリケーションでのメモリリークである可能性があります。たとえば、向きを注意深く扱わないと、メモリリークが発生しやすくなります。アプリケーションメモリが飽和している場合、OutOfMemoryErrorは任意のメモリ割り当てによってトリガされますが、この1つのメモリ割り当てはプロセスメモリの飽和全体に関与しない場合があります。

+0

SAXが1つのファイル全体を読み込むのは本当ですか?私の場合は2番目のオプションを考えましたが、ユーザーが4mib XMLファイルを使用していて、ファイル全体がユーザーは新しいノードにナビゲートして、かなり低速なブラウジングにつながろうとします。最も簡単な選択肢は、もちろん、3番目のオプションでしょう、私は様々なファイルサイズなどのいくつかのテストを実行する必要がありますね –

+0

アプリケーションに割り当てられるメモリを増やす方法がありますか? –

+0

いいえ、制限はデバイスによって異なる場合があります。 –

0

メモリが不足(XMLファイルがRAMに格納されている場合)は簡単に可能です。 SAX Parserはストリームベースの解析手法です(DOM Parserとは異なり)。したがって、SAX自体は多くのメモリを消費することはできません。最良の方法は、XMLを外部ファイル/ストレージに保存し、ストリームデータをファイルからSAX Parserに直接保存することです。このようなアプローチは、SAXパーサーを使用する方法とまったく同じです。

+0

XMLファイルは実際に配列に渡されるので、基本的にはDOMパーサと同じように空腹になります。ファイルサイズテストを実行して、OoMEの原因となっているバイト数を判断すると思います。 –