2012-01-10 71 views
2

我在我的WP7應用程序中解析一個大的xml文件(1 MB)。該文件是該項目的一部分, ,所以它不通過網絡加載。不幸的是,它需要很長的時間。 3秒,到 得到我需要的內容。我已經閱讀過,問題在於xml序列化,並且它的 更適合二進制序列化。提高從大型XML字符串反序列化的性能

但我現在有我的XML文件,有沒有可能改變我的xml文件的格式或 ,以便解析會更快?我已經在很多地方分割它, 但它並不顯着更快。

+1

你有異形,看看那裏的瓶頸是什麼?它是IO,它是CPU等? – RQDQ 2012-01-10 16:49:57

+0

這篇文章將幫助你http://codebetter.com/gregyoung/2008/08/24/fast-serialization/ – Code0987 2012-01-11 11:34:19

回答

1

1兆字節並不是特別大。

二進制格式將更加緊湊和更快,特別是如果您自己編寫而不是使用.net序列化支持,這會增加數據的大量開銷。爲元素

  • 使用短名稱和屬性:

    如果你想堅持使用XML,通常可以顯著通過使用簡單的,緊湊的格式提高性能例如v而不是vertexentry。

  • 使用具有屬性中的數據的自閉元素而不是cdata或子元素來包含單個值。這通常會更緊湊。
  • 如果您有一個簡單值列表,請考慮使用包含逗號分隔列表的單個字符串值,而不是大量單個元素/屬性。例如使用p =「12,22」而不是x =「12」y =「22」。這是更少的數據讀取,更少的項目解析,並減少一半的方法調用讀取XML元素/閱讀器的值。
  • 只存儲有用的精度。雙轉換爲字符串使用大量的數字。如果你只需要3位小數的精度,只能存儲3d.p.

配置文件並優化您的加載代碼 - 您可能會發現與xml無關的瓶頸。你可以推遲一些工作,或者在另一個線程上做一些數據轉換處理,但是要小心爲小增益引入大的複雜性。

最後,嘗試不同的方法 - XmlDocument而不是XmlReader或不同的庫,或將數據預加載到MemoryStream中。您也可能會在那裏找到改進。

或者只是告訴你的老闆,那是因爲你沒有快速的固態硬盤TB級八個核至強... :-)

0

如果您不需要一次處理所有數據,處理它的一種方法是手動異步加載數據塊(您可能需要手動解析數據),並在加載時更新塊大小。另外,如果在序列化過程中有任何額外的數據,您可以隨時想出您自己的xml模式,這種xml模式不那麼冗長,只包含您需要的裸露信息。

0

你至少有四個選項:

  • 使用最快的可用XML解串器。你可以找到here好的比較。 sharpSerializer似乎最快。
  • 您可以編寫自己的二進制解串器和串行器。
  • 您可以使用SQL CE數據庫引擎。
  • 您可以將數據放在Web服務器上並公開Web服務以查詢數據。但是現在你有問題如何在服務器上存儲數據。服務器通常當然比電話快,但...
+0

有沒有任何「簡單」的方法來獲得我的XML文件到sql ce數據庫? – 2012-01-11 16:08:17

+0

您可以轉換xml並將其加載到準備好的模式的數據庫,請參閱:http://www.xtremevbtalk.com/showthread.php?t = 194662但這並不容易;) – Pol 2012-01-12 08:24:54