【问题标题】:Parse large XML files over a network通过网络解析大型 XML 文件
【发布时间】:2011-01-09 07:33:46
【问题描述】:

我在网站上进行了一些快速搜索,但似乎找不到我正在寻找的答案,因此可以说,通过网络传递大型 xml 文件的最佳实践是什么。我对此事的想法是在可管理的段中通过网络流式传输块,但是我正在为此寻找其他方法和最佳实践。我意识到大是一个相对术语,所以我会让你选择一个任意值来被认为是大的。

如果有任何混淆,问题是“跨网络发送大型 xml 文件的最佳做法是什么?”

编辑:

我看到很多关于压缩的讨论,任何可以使用的特定压缩算法以及解压缩所述文件?当我知道那里有经过验证的算法时,我并不想推出自己的算法。我也感谢到目前为止的回复。

【问题讨论】:

  • 通常使用的压缩类型是 gzip。既然你用“servlet”标记了它,我假设你正在使用 Java,所以你可以使用 java.util.zip.GZIPOutputStream。

标签: java xml servlets network-programming


【解决方案1】:

压缩是一种显而易见的方法。这个 XML bugger 会像没有明天一样缩小。

【讨论】:

    【解决方案2】:

    根据它的大小,您可能需要先考虑压缩它。当然,这取决于相同数据的发送频率和更改频率。

    说实话,绝大多数时候,最简单的解决方案都可以正常工作。我建议先以最简单的方式传输它(可能是一次性传输),如果结果证明有问题,请继续对其进行分段,直到找到一个很少被破坏的大小。

    【讨论】:

    • 为了我学习正确的方法,我有一个经常更改的大文件和一个很少更改的大文件。
    • 测试确实是了解什么最有效的最佳方式。然后gzip发送,重复1000次,看看总时间是多少。与不压缩发送相比。还要确保考虑传输错误。
    【解决方案3】:

    如果您可以在服务器上保留一个本地副本和两个副本,您可以使用diffxml 将您必须传输的内容减少到仅更改,然后 bzip2 差异。这将大大降低带宽需求,但会牺牲一些存储空间。

    【讨论】:

      【解决方案4】:

      您是在使用适当的 XML 解析器来读取 XML,还是带着对特定布局的期望来读取它?

      对于 XML 数据馈送,等待整个文件下载可能会浪费内存和处理时间。你可以编写一个自定义解析器,也许使用正则表达式搜索,如果你能保证 XML 在标签中没有任何换行符,它会逐行查看 XML。

      如果您的代码可以一次消化一个节点的 XML,然后使用诸如 Transfer-Encoding: chunked 之类的东西每次将其吐出一个节点。您写入块的长度(以十六进制表示),然后是块,然后是另一个块,或者最后是“0\n”。为了节省带宽,请对每个块进行 gzip。

      【讨论】:

      • 抱歉,因为 xml 上的正则表达式的建议而不得不投票,正如我所见,这是一个坏主意。不过谢谢你的第二点。
      【解决方案5】:

      十多年来,压缩和减小 XML 大小一直是个问题,尤其是在带宽和客户端计算能力都是稀缺资源的移动通信领域。无线通信中使用的最终解决方案是WBXML (WAP Binary XML Spec),如果我在客户端和服务器端都有足够的控制权,我更喜欢使用它。

      该规范定义了如何将 XML 转换为二进制格式,这种格式不仅紧凑,而且易于解析。这与 gzip 等通用压缩方法形成对比,后者需要接收端的高计算能力和内存来解压缩然后解析 XML 内容。此规范的唯一缺点是应用程序令牌表应存在于两侧,这是一个静态定义的代码表,用于保存特定于应用程序的 XML 内容中所有可能的标记和属性的二进制值。如今,这种格式广泛用于移动通信中,用于在大多数应用程序中传输配置和数据,例如 OTA 配置和联系人/便笺/日历/电子邮件同步。

      为了使用这种格式传输大型 XML 内容,您可以使用类似于 SyncML 协议中提出的分块机制。您可以找到设计文档here,在“2.6. 大对象处理”一节中描述了这种机制。作为一个简短的介绍:

      此功能提供了一种同步对象的方法,该对象的大小超过了可以在一条消息中传输的大小(例如,最大消息大小 - 在 MaxMsgSize 中声明 元素——目标设备可以接收)。这是通过将对象拆分成块来实现的,每个块都适合一条消息,并通过连续发送它们来实现。第一个数据块与对象的整体大小和一个 MoreData 标记一起发送,表示将发送更多块。每个后续块都使用 MoreData 标记发送,除了最后一个。

      【讨论】:

      • 因为这是最具描述性和信息量最大的帖子,所以我选择了这个作为答案。
      猜你喜欢
      • 2011-05-09
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      • 2012-04-28
      • 1970-01-01
      • 1970-01-01
      • 2015-06-23
      • 2010-09-22
      相关资源
      最近更新 更多