3

.NET XmlDocumentクラスを使用して XML ファイルを読み取る Mono for Android アプリケーションがあります。各ドキュメントは約 180K です。

各ドキュメントを解析し、独自の内部データ構造を作成した後、XmlDocumentインスタンスへの参照を残さないため、ガベージ コレクションの対象になります。

ただし、問題は、コレクションが発生するまでに 5 ~ 6 秒かかることです。5 ~ 6 秒以内に複数のドキュメントをロードすると、アプリが OS にクラッシュし、エラー メッセージが出力されたり、例外がスローされたりすることはありません。スレッド12が終了したとだけ言っています(私は余分なスレッドを作成していないので、なぜそれがスレッド12なのかわかりません-XmlDocumentのスレッドですか?)。

ドキュメント 1 をロードしてから 5 秒待ってからドキュメント 2 をロードし、5 秒待ってからドキュメント 3 をロードすると、すべて問題ありません。

その場合、5 秒間の待機中に、GC が数回起動し、4 ~ 5 サイクルで合計約 1MB のメモリが解放されるのがわかります (一部は EXPLICIT とマークされ、一部は CONCURRENT とマークされています)。

また、見つけた記事で示唆されているように、完了したら xmlDocument.RemoveAll() への呼び出しを追加しようとしました。その後、GC.Collect() への呼び出しも追加しました。少しは役に立ちましたが、それでもクラッシュする頻度はやや減りました。

使用可能なメモリを増やすか、XmlDocumentの動作を改善する方法はありますか?

4

1 に答える 1

0

これは代替手段であるため、あまり答えではありませんが、XmlTextReaderを使用してXML解析コードを書き直したところ、問題は発生しなくなりました。

もちろん、XmlTextReaderはXMLファイル全体をメモリにロードする必要はありません。これはメモリ使用量の大きな助けになります。

複数のファイルを次々と非常にすばやくロードでき、クラッシュすることもありません。

XmlTextReader APIは正しく機能するためにより多くの作業が必要でしたが、現在はかなり堅実に見えます。

于 2012-08-15T20:38:59.457 に答える