java - 有什么方法可以替代使用 DOM XML 解析器对大型 XML 文档进行多个查找操作?

标签 java xml parsing dom memory

我在 XML 文档中存储用于对用户进行排名的数据 - 每个用户一行 - 包含 36 个字符的键、分数、排名和用户名作为属性。

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<!DOCTYPE Ranks [<!ELEMENT Rank ANY ><!ATTLIST Rank id ID #IMPLIED>]>
<Ranks>
..<Rank id="<userKey>" score="36.0" name="John Doe" rank=15></Rank>..
</Ranks>

有几个这样的文档,它们根据请求使用 DOM 解析器进行解析,并保存在内存中,直到文件被更新。这发生在支持小部件的 HttpServlet 中。每次加载小部件时,它都会使用 get 请求调用 servlet,然后需要查询其中一个文档。对文档的查询需要进行以下操作:

  • 查找 - 查找特定 ID
  • 遍历每个 Rank 元素并获取 id 属性

在我的测试环境中,用户数量小于 100,一切正常。然而,我们很快就会交付给一个拥有 200K+ 用户的系统。我非常担心我的方法的可扩展性——即 OutOfMemoryException!

我一直在寻找平衡性能和内存使用的实现的想法。虽然 DOM 非常适合查找操作,但它可能会因为体积过大而窒息。我对 StAX 了解不多,但从我读到的内容来看,它似乎可以解决内存问题,但确实会减慢查询速度,因为我将不得不有效地遍历文档以找到感兴趣的元素(是吗?正确的?)。

问题:

  • 是否可以使用 StAX 对大型文档进行多次查找(如 getElementById)操作,速度足以满足 HttpRequest 的要求?
  • DOM 解析器可以处理的最大文件大小是多少?
  • 是否可以估算每个用户将使用多少内存来处理具有上述结构的 XML 文档?

谢谢

编辑:我不允许使用数据库。

编辑:改用自定义格式化文件并使用正则表达式在文件中搜索所需条目会更好/更整洁吗?

最佳答案

听起来您正在将 xml 文档用作数据库。我认为为此使用适当的数据库,并根据需要导入/导出到 xml,您会更开心。有几个数据库可以很好地工作,因此您不妨使用一个受良好支持的数据库,例如 mysql 或 postgresql,尽管即使是 sqlite 也比 xml 工作得更好。

就 SAX 解析而言,您基本上构建了一个大型状态机来处理解析时发生的各种事件(输入标记、离开标记、查看数据等)。然后你自己管理内存(根据你所处的状态记录你看到的数据),所以你是正确的,它可以有更好的内存占用,但是为每个网络请求运行这样的查询太荒谬了,尤其是当您可以将所有数据存储在一个漂亮的索引数据库中时。

关于java - 有什么方法可以替代使用 DOM XML 解析器对大型 XML 文档进行多个查找操作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9678204/

相关文章:

java - Spring 3拦截器错误: Type Element type "beans" must be followed by either attribute specifications, ">"或 "/>"

java - 检查 VTD-XML 中的 XPath 是否评估为 XML 标签(或)文本(或)标签列表(或)文本列表

html - 使用 sed 删除 html 表格列

C++ 将值解析为 vector 的更好方法

java - 我可以在 Maven 中编译具有依赖关系的混合 java 和 scala 代码的 Scala 项目吗?

Javax.sound.midi 学习代码不适用于 MacOS X

java - 如何在 swing 中调整与面板相关的组件的大小?

java - 使用 Sniffy 指定的 Oracle URL 无效

java - Android float 操作按钮未被识别

具有控制流枚举的 Java 解析器