【问题标题】:Improving performance of deserializing from large XML strings提高从大型 XML 字符串反序列化的性能
【发布时间】:2012-01-10 16:45:43
【问题描述】:

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

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

【问题讨论】:

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


【解决方案1】:

1 兆字节并不是特别大。

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

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

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

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

最后,尝试不同的方法 - XmlDocument 而不是 XmlReader,或者不同的库,或者将数据预加载到 MemoryStream 中。您可能会发现那里也可以进行改进。

或者只是告诉你的老板这是因为你没有八核至强和 TB 的快速 ssds...:-)

【讨论】:

    【解决方案2】:

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

    此外,如果序列化过程中有任何额外数据,您总是可以提出自己的 xml 架构,该架构不那么冗长,并且只包含您需要的裸露信息。

    【讨论】:

      【解决方案3】:

      您至少有四个选项:

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

      【讨论】:

      • 是否有任何“简单”的方法可以将我的 xml 文件放入 sql ce 数据库?
      • 您可以转换 xml 并使用准备好的模式将其加载到数据库中,请参见:xtremevbtalk.com/showthread.php?t=194662 但这并不容易 ;)
      猜你喜欢
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-19
      • 1970-01-01
      • 2017-02-26
      • 1970-01-01
      相关资源
      最近更新 更多