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

发布于 2024-12-25 17:27:16 字数 209 浏览 2 评论 0原文

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

但我现在有了 xml 文件,是否有可能更改格式或其他内容 我的 xml 文件,这样解析会更快?我已经把它分成很多部分了 但速度并没有显着加快。

i am parsing a big xml file (1 MB) in my WP7 App. The file is part of the project,
so its not loaded through the web. Unfortnuately it takes very long, ca. 3 seconds, to
get the content i need. I have read, that the problem is the xml serialization, and its
better to go for a binary serialization.

But i have my xml file now, is there any possibility to change the format or something
of my xml file, so that the parsing will go faster? I have split it in many parts already,
but its not significant faster.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

尬尬 2025-01-01 17:27:16

1兆字节并不是特别大。

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

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

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

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

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

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

1 megabyte isn't particularly big.

A binary format will be more compact and faster, especially if you write your own rather than using the .net serialisation support, which adds a lot of overhead to the data.

If you want to stick with xml, you can usually improve performance significantly by using a brief, compact format:

  • use short names for elements and attributes: e.g. v rather than vertexentry.
  • use self-closing elements with data in attributes rather than cdata or child elements to contain single values. This usually works out more compact.
  • if you have a list of simple values, consider using a single string value containing a comma-separated list, rather than lots of individual elements/attributes. e.g. use p="12,22" rather than x="12" y="22". This is less data to read, fewer items to parse, and halves the number of method calls to read values from the xml element/reader.
  • only store useful precision. A double converted to a string uses a lot of digits. If you only need 3 decimal places of accuracy, only store 3d.p.

Profile and optimise your loading code - you may find bottlenecks that are nothing to do with xml. You may be able to defer some work, or do some data conversion processing on another thread, but beware of introducing big complexity for small gains.

Finally, try different approaches - XmlDocument rather than XmlReader, or a different library, or pre-loading the data into a MemoryStream. You may find improvements can be made there too.

Or just tell your boss it's because you don't have an eight core xeon with a terabyte of fast ssds... :-)

如日中天 2025-01-01 17:27:16

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

另外,如果序列化中有任何额外的数据,您始终可以提出自己的 xml 架构,该架构不太冗长,并且仅包含您需要的裸信息。

If you don't need all the data at once, one way to handle it is to asynchronously load chunks of data manually (you might need to parse the data manually) and update the UI in chunks as it loads.

Also, if there is any extra data in the serialization, you could always come up with your own xml schema that is less verbose and only contains the bare information that you need.

耀眼的星火 2025-01-01 17:27:16

您至少有四个选择:

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

You have at least four options:

  • Use fastest available XML deserializer. You can find here good comparsion. sharpSerializer seems to fastest.
  • You can write your own binary deserializer and serializer.
  • You can use SQL CE database engine.
  • You can put data on web server and expose web service to query data. But now you have question how to store data on server. Server is usually of course faster than phone but...
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文