2012-01-10 53 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