提高从大型XML字符串反序列化的性能

时间:2012-01-10 16:45:43

标签: c# windows-phone-7 xml-parsing

我正在解析我的WP7应用程序中的一个大的xml文件(1 MB)。该文件是项目的一部分, 所以它没有通过网络加载。不幸的是,它需要很长时间,约。 3秒,到 得到我需要的内容。我已经读过,问题是xml序列化,以及它的问题 最好去二进制序列化。

但我现在有我的xml文件,是否有可能更改格式或其他内容 我的xml文件,以便解析会更快?我已经将它拆分成很多部分, 但它的速度并不快。

3 个答案:

答案 0 :(得分:1)

1兆字节不是特别大。

二进制格式将更紧凑,更快,特别是如果您自己编写而不是使用.net序列化支持,这会给数据增加很多开销。

如果您想坚持使用xml,通常可以使用简洁紧凑的格式来显着提高性能:

  • 为元素和属性使用短名称:例如v而不是vertexentry。
  • 将自闭元素与属性中的数据一起使用,而不是使用cdata或子元素来包含单个值。这通常更紧凑。
  • 如果您有简单值列表,请考虑使用包含逗号分隔列表的单个字符串值,而不是使用大量单个元素/属性。例如使用p =“12,22”而不是x =“12”y =“22”。这样可以减少要读取的数据,减少要解析的项目,并减少从xml元素/ reader读取值的方法调用次数。
  • 仅存储有用的精度。转换为字符串的double使用大量数字。如果您只需要3位小数的精度,则只存储3d.p。

配置并优化您的加载代码 - 您可能会发现与xml无关的瓶颈。您可以推迟一些工作,或者在另一个线程上进行一些数据转换处理,但要注意为小的收益引入大的复杂性。

最后,尝试不同的方法 - XmlDocument而不是XmlReader,或不同的库,或者将数据预加载到MemoryStream中。你也可以在那里找到改进。

或者只是告诉你的老板,因为你没有带有1 TB快速ssds的八核xeon ...... :-)

答案 1 :(得分:0)

如果您不需要同时处理所有数据,处理它的一种方法是手动异步加载数据块(您可能需要手动解析数据)并在加载时以块的形式更新UI。

此外,如果序列化中有任何额外数据,您总是可以提供自己的xml架构,该架构不那么详细,只包含您需要的裸信息。

答案 2 :(得分:0)

您至少有四个选择:

  • 使用最快的XML反序列化程序。你可以找到here好的比较。 sharpSerializer似乎最快。
  • 您可以编写自己的二进制解串器和序列化器。
  • 您可以使用SQL CE数据库引擎。
  • 您可以将数据放在Web服务器上,并将Web服务公开给查询数据。但现在您有问题如何在服务器上存储数据。服务器通常比电话更快但是......