3

私は、アイテムのリストを形成し、それらに関する情報を表示するために、ローカル xml を解析する iOS および Android 用のかなり単純なアプリを開発しています。解析オプションを調べたところ、android 用のネイティブ SAX パーサーと、objective-C に組み込まれている NSXMLparser クラスに落ち着きました。私のオプションを見ていると、DOM パーサーは大きな xml ファイルには適していないと言っている人を繰り返し見ました。しかし、「大きい」の意味を正確に定義した人はいません。アプリの新しいバージョンでは、DOM パーサーに切り替えることを考えています。

私の質問は次のとおりです。どこで線を引き、オプションとして DOM パーサーを排除しますか? 問題のプラットフォームは iOS と Android で、もちろんどちらにも古いデバイスがたくさん出回っています。では、平均よりも遅いデバイスを想定すると、線はどこに引かれるのでしょうか?

ご検討をお願いいたします。

4

2 に答える 2

8

DOMパーサーは、XML全体をメモリーにロードする必要があります。また、解析されたXMLは、元のXMLのサイズと比較して5倍から10倍のメモリを占有するのが一般的です。

アプリケーションの許容メモリ消費量がNメガバイトのRAMであることがわかっている場合は、自分でその線を引くことができます。Nを10で割ります。

たとえば、10MBのRAMを超えたくない場合は、XMLが1MBを超えないようにする必要があります。

最新のデバイスのみが1GBのRAM(すべてのアプリに分割)を備えており、古いデバイスは512MB、さらには256MBを備えていました。256MB / 10=25MB。おそらく、すべてのメモリの10%を超えて消費したくないので、すべてのプラットフォームでサポートされているDOMXMLの2.5MBを超えるものは多すぎます。

しかし、これは経験則であり、実際のテストでのみ真実を知ることができます。

于 2013-01-14T23:11:05.183 に答える
1

何が大きすぎるの?これは、使用しているワーキング メモリの量の関数であり、デバイスによって異なります。iPhone では、3GS では 256MB しかなく、iPhone 4 では 512MB、iPhone 5 では 1GB しかありません。

ちなみに、 whileNSXMLParserは SAX パーサーですが、 を使用するinitWithContentsOfURLと、解析が始まる前にフィード全体がメモリに読み込まれます。したがって、DOM のように大量のメモリを消費しますが、扱いにくい SAX のようなインターフェイスを使用します。その結果、Apple のPerformanceXML サンプルを見ると、フットプリントの小さいストリーミング SAX パーサーを示している場合、適切にストリーミングされる にフォールバックしLibXML2ます。を使用する場合、 myを でNSXMLParserラップすることによっても同様の効果が得られたので、SAX パーサーが可能にする小さなメモリ フットプリントで呼び出して楽しむことができます。NSURLConnectionNSInputStreaminitWithStreamNSXMLParser

要するに、非常に大きな XML ファイルを解析するときは、SAX パーサーが過度にメモリを消費するのではなく、 を使用するか、LibXML2または.NSXMLParserNSInputStream

私にとって、これは完全に恣意的です。XML が 1MB をはるかに超える場合は、ストリーミング SAX パーサーを使用しますLibXML2。そんなに大きい場合は、DOM パーサーも使用しませんNSXMLParser

Ray Wenderlich のHow to Choose the Best XML Parser for Your iPhone Projectも参照してください。

于 2013-01-14T23:49:27.820 に答える