我有一个读取 XML 文件的进程。它使用 XMLTextReader 类来执行此操作,因为它应该是一个快速、仅转发的 XML 解析器/读取器。
对 1 兆字节的测试文件非常有效,但在实时系统中处理 12 兆字节的文件时会完全停止。
除了编写我自己的 XML 阅读器之外,还有其他解决方案吗?这不是世界末日,但如果可能,我更愿意使用可用的标准组件
我有一个读取 XML 文件的进程。它使用 XMLTextReader 类来执行此操作,因为它应该是一个快速、仅转发的 XML 解析器/读取器。
对 1 兆字节的测试文件非常有效,但在实时系统中处理 12 兆字节的文件时会完全停止。
除了编写我自己的 XML 阅读器之外,还有其他解决方案吗?这不是世界末日,但如果可能,我更愿意使用可用的标准组件
如果问题出在 XmlTextReader 中,我会感到非常惊讶。
如果您花几分钟时间编写一个创建 XmlTextReader 的测试程序并简单地使用 Read() 读取文件中的每个节点,直到它到达文档的末尾,我敢打赌您会发现它放大了您的12mb 文件就像一把热刀穿过黄油。如果我遇到这个问题,这是我会尝试的第一件事。
因为一旦您消除了 XmlTextReader 作为问题的根源,您就可以将注意力集中在实际导致它的原因上 - 这很可能是处理您正在读取的节点的代码,而不是读取节点的代码.
SAXExpat曾经非常好。Expat 是XML解析器,几乎是一个参考实现。我记得用它来读取一些通过 TCP 连接发送的同步 XML 文件,有时是非常大的文件(大约 50mb),没有任何问题。那是 3/4 年前,在 .NET 1.1 和非常糟糕的计算机中。
我不想推荐这个,但如果该软件没有出售或外部,您可以尝试从 Mono 引入阅读器,看看是否能解决您的问题。
我过去也遇到过类似的性能问题。我将其追溯到尝试远程解决 DTD/模式。你在做这个吗?如果可能,请尝试将 XmlTextReader.XmlResolver 设置为 null。
取决于你如何处理你从读者那里得到的东西。您是将其放入 XML DOM 还是任何对象模型中?无论您使用什么语言或库,这都会对内存造成很大影响。
可能是1.1有缺陷,想试试2.0?我在 1.1 天从未使用过 XmlTextReader,所以我不能保证它:但从 2.0 开始它是完美的。
只是一个想法。您是否在整个过程中打开数据库事务?如果是这样,请在没有事务的情况下尝试它,或者至少在此过程中更频繁地提交。