2012-02-05 2 views
0

私は電話でアプリケーションを持っており、約50ページのXMLが必要です。各XMLには約100のノードがあります。あなたが約5,000のノードである数学を行うならば、私は解析しています。これらのノードが同じように設定されていないことがあります。例:おそらく75%が他の25%と異なるスキーマを持っているので、これを処理して別々に解析するコードがあります。WP7でのXMLパフォーマンスの最適化のヒント

httpコールを最適化することはできません。ウェブサービスは一度に100個の「アイテム」しか配信しないので、基本的にはすべてのページを取得するために50回Webサービスをヒットする必要があります。データ。ここに高レベルのプロセスがあります。

 
Call web service (webclient) 
Parse XML (take note total pages in xml. it will say Page 1 of 100) 
Add results to collection 
Call web service again for page 2 
Parse 
Add results to collection 
....rinse and repeat 100 times.

私が最適化できる唯一の場所は、解析コードです。私がやっているのは、linqを使ってXMLを解析し、IEnumerable内のノードを分離し、それらを解析して、私が作成したカスタムオブジェクトに配置することです。私は、このプロセス全体を最適化する方法に関するいくつかの高いレベルのアイデアを探しています。たぶん私は何かが欠けているでしょう。

いくつかのコードはちょうど1000回以上と同じように、以下のことを想像してください。より多くの属性を使用すると、これは小さな例です。ほとんどの場合、解析が必要な30の属性があります。実際のスキーマにはアクセスできず、スキーマの変更は制御できません。

XElement eventData = XElement.Parse(e.Result); 
IEnumerable<XElement> feed = 
    (eventData.Element("results").Elements("event").Select(el => el)).Distinct(); 
foreach (XElement el in feed) 
{ 
    _brokenItem = el.ToString(); 
    thisFeeditem.InternalGuid = Guid.NewGuid().ToString(); 
    thisFeeditem.ServiceIcon = GetServiceIcon(thisFeeditem.ServiceType); 
    thisFeeditem.Description = el.Attribute("displayName").Value; 
    thisFeeditem.EventURL = el.Attribute("uri").Value; 
    thisFeeditem.Guid = el.Attribute("id").Value; 
    thisFeeditem.Latitude = el.Element("venue").Attribute("lat").Value; 
    thisFeeditem.Longitude = el.Element("venue").Attribute("lng").Value; 
} 
+0

(1)は、これが呼び出されるたびに異なるサービスから取得したXMLです。何も変更されていない時間があります。(2)あなたは、サービスの振る舞い? –

+1

あなたの解析のコードサンプルが役に立ちます。 –

+0

私は家に帰るときに質問に答えるためにいくつかのコードを追加します。私はそのサービスを支配していない。私は、ページされたバージョンよりも巨大な単一のXMLを好むだろう。私はAPIがページング用のWebページ用に設計されたものであり、太ったクライアント用ではないと感じています。第二に、結果はページごとに異なります。 – firebellys

答えて

2

コードを見ることなく、最適化するのは簡単ではありません。しかし、考慮すべき点が1つあります。

Linq-to-XMLは、XML文書全体をメモリに常駐するモデルに読み込む点で、DOMベースのパーサです。すべてのクエリはDOMに対して実行されます。大きなドキュメントの場合、DOMを構築することはメモリとCPUを集中させることになります。また、LinqからXMLへのクエリが非効率的に記述された場合、同じツリーノードを複数回ナビゲートできます。

代わりに、XmlReaderのようなシリアルパーサーを使用することを検討してください。このタイプのパーサーは、ドキュメントのメモリベースのモデルを作成せず、前方のみの方法で動作し、各要素を一度読み取るように強制します。

0

アーキテクチャを変更できます。

XMLデータの収集とフィルタリングを行うWebサービスを作成し、電話機でそのWebサービスからデータを取得します。

このように処理すると、(規模変更可能な)サーバに処理が移り、すべてのクライアントを更新する必要はなく、XMLソースが変更されたときにサービスを変更するだけです。

結果をキャッシュして重複を防止することもできます。

今、あなたは電話で何が起こっているかを完全に管理しています。

+0

これは遠い地平線上にあります。私はAzureバージョンのコードに取り組んでいるので、電話機はただ電話をかけて、1つのチャンク(圧縮された多分)で答えを待っています。私は紺碧のサーバーは、XMLを迅速に対処し、おそらくより良いキャッシュに対処すると思う。 – firebellys

関連する問題