2016-04-11 17 views
0

私のアプリはGPXファイル(XML)をインポートしてから、すばらしいXML Dictionaryライブラリを使ってXMLとGPXを解析するという素晴らしい仕事をしていますが、私が試してみたいと考えている85MBのファイル。それは巨大な16,000以上のGPXウェイポイントを含んでいます。巨大なXMLファイルを解析する方法

現在、私はNSURLNSDataに読み込み、パーサを使用しています。しかし、大きなファイルで試してみると、メモリの警告とクラッシュが発生します。

メモリエラーが発生しないように、このような大きなファイルの解析をどのようにチャンクすることができますか?

答えて

1

使用しているXMLディクショナリライブラリの問題は、XMLファイル全体の大規模なオブジェクトツリーを構築することです。これは、多くのメモリを使用します。

標準NSXMLParserクラスなど、SAXパーサーを使用する方がずっと良いです。解析が進むにつれて保持するデータ構造を除き、何もメモリに保持されません。

いずれの場合でも、解析する前にXMLファイル全体をメモリにロードする必要はありません。ファイルへのストリームを開き、ストリームをパーザに渡します。

+0

'XML辞書は' NSXMLParser'を使用します。彼らは何をしていますか? –

+0

githubプロジェクトのメインページの説明を読んでください。 XMLディクショナリは、XMLドキュメント全体を表すオブジェクトの巨大なツリーを構築しています。 NSXMLParserがメモリの問題を引き起こしていることを超えていることは、余計なオーバーヘッドです。基本的に、XMLファイルの3つのコピーがメモリにあります。 1)ファイル全体の完全なNSData。 2)XML辞書によって構築された巨大な木。 3)解析されたXMLを処理した後の独自のデータモデル。 #1は、ファイル全体をメモリにロードするのではなく、XMLファイルへのストリームを開くことで回避できます。 NSXMLParserだけで#2を避けることができます。 – rmaddy

+0

これを行うヘルパークラスはありますか?私はあなたが言及している方法で 'NSXMLParser'を使ってストリームを開くことに関するそこに少しの情報を見つけることです。 –

関連する問題