Java 对大型XML文档使用DOM XML解析器进行多个查找操作的替代方法是什么?

Java 对大型XML文档使用DOM XML解析器进行多个查找操作的替代方法是什么?,java,xml,parsing,dom,memory,Java,Xml,Parsing,Dom,Memory,我在XML文档中存储用户排名数据——每个用户一行——包含36个字符的键、分数、排名和用户名作为属性 ]> .... 有几个这样的文档是根据请求使用DOM解析器解析的,并保存在内存中,直到文件更新。这在支持小部件的HttpServlet中发生。每次加载小部件时,它都会使用get请求调用servlet,然后需要查询其中一个文档。对文档的查询需要执行以下操作: 查找-查找特定ID 迭代每个Rank元素并获得id属性 在我的测试环境中,用户的数量是,听起来像是将xml文档用作数据库。我认为您会更乐意

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

]> ....

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

查找-查找特定ID 迭代每个Rank元素并获得id属性
在我的测试环境中,用户的数量是,听起来像是将xml文档用作数据库。我认为您会更乐意为此使用适当的数据库,并根据需要导入/导出为xml。有几个数据库工作得很好,所以您最好使用一个受良好支持的数据库,如mysql或postgresql,尽管即使是sqlite也比xml工作得更好


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

听起来您好像在使用xml文档作为数据库。我认为您会更乐意为此使用适当的数据库,并根据需要导入/导出为xml。有几个数据库工作得很好,所以您最好使用一个受良好支持的数据库,如mysql或postgresql,尽管即使是sqlite也比xml工作得更好


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

这里的一个大问题是DOM不是线程安全的,因此即使是读取操作也需要同步。从这个角度来看,使用JDOM或XOM肯定会更好


另一个问题是用于查找数据的搜索策略。您确实希望通过索引而不是使用串行搜索来支持查询。事实上,您需要一个像样的查询优化器来生成高效的访问路径。因此,考虑到您不使用数据库的限制,这听起来像是一个具有渐进优化功能的内存中XQuery引擎的例子,其中最明显的候选对象是Saxon EE。但是我会说,不是吗?

这里的一个大问题是DOM不是线程安全的,所以即使是读取操作也需要同步。从这个角度来看,使用JDOM或XOM肯定会更好


另一个问题是用于查找数据的搜索策略。您确实希望通过索引而不是使用串行搜索来支持查询。事实上,您需要一个像样的查询优化器来生成高效的访问路径。因此,考虑到您不使用数据库的限制,这听起来像是一个具有渐进优化功能的内存中XQuery引擎的例子,其中最明显的候选对象是Saxon EE。但是我要说的是,对于繁重的XML处理,VTD-XML是最有效的选择,它比JDOM、DOM4j或DOM效率要高得多。。。关键是信息集建模的非面向对象方法。。。它也不太可能导致内存不足异常。。。阅读这篇2013年的文章,了解各种XML框架之间的全面比较/基准测试


对于繁重的XML处理,VTD-XML是可用的最有效的选项,它远比JDOM、DOM4j或DOM更有效。。。关键是信息集建模的非面向对象方法。。。它也不太可能导致内存不足异常。。。阅读这篇2013年的文章,了解各种XML框架之间的全面比较/基准测试


可能有兴趣。我不久前读到过,但我自己从未尝试过。最后,我为.NET编写了自己的专用XML流处理器。可能有兴趣。我不久前读到过,但我自己从未尝试过。最后,我为.NET编写了自己的专用XML流处理器。我同意,一个合适的数据库会很棒——但作为我们的一个限制,我们只允许在数据库中使用一个具有预定结构的表。所以实际上不允许使用数据库。这似乎是愚蠢的限制。但是,如果你不能使用数据库
se,在内存中构建自己的内存是很容易的。你的记录并不复杂;一个简单的结构将很好地存储它们,尽管如果字符串可能相同,您可能会共享这些字符串。在这些数组之上构建哈希表或其他索引非常简单。阅读XML,在内存中构建数据库。我猜你的结构是几十个字节,乘以200K->4M字节,乘以几个文档->12M字节。问题出在哪里?我相信这个约束条件有一定的教学价值,尽管我觉得有点可疑:/你仍然可以使用这个表来存储数据,尽管这意味着要跳过一些障碍。sqlite数据库只是文件系统上的一个文件,所以您仍然应该检查它。另一方面,如果你想把所有东西都存储在内存中,请考虑只通过在数组和哈希表中存储绝对必要的数据来优化内存使用,然后根据需要串行化到/XML。@ IRABAXTEL:嗯,DOM文档对象不是内存中的数据库吗?如果DTD指定ID属性是什么,那么文档包含一个底层哈希集,这使得查找变得非常复杂。在给定的时间内,内存中可能有大约60个这样的文档。我可以想象一个线程使用240 MB会影响整个服务器的性能是吗?所以问题主要在于是把所有的信息都保存在内存中,还是找到一种在磁盘上快速获取信息的方法。嗯……所以基本上我应该对数据进行修剪,因为只存储必要的数据;不要使用XML。相反,我应该读取整个文件并构建Hashmaps和数组,将数据存储在内存中,以便进行查找和迭代操作。现在唯一的问题是读取文件和将字符串数据转换为上述数据结构所需的时间。希望我们能很快得到一个合适的测试环境来运行一些压力测试。谢谢你们的帮助。我同意,一个合适的数据库是很棒的——但是作为我们的一个限制,我们只允许使用数据库中一个具有预定结构的表。所以实际上不允许使用数据库。这似乎是愚蠢的限制。但是,如果您不能使用数据库,那么在内存中构建自己的数据库就足够容易了。你的记录并不复杂;一个简单的结构将很好地存储它们,尽管如果字符串可能相同,您可能会共享这些字符串。在这些数组之上构建哈希表或其他索引非常简单。阅读XML,在内存中构建数据库。我猜你的结构是几十个字节,乘以200K->4M字节,乘以几个文档->12M字节。问题出在哪里?我相信这个约束条件有一定的教学价值,尽管我觉得有点可疑:/你仍然可以使用这个表来存储数据,尽管这意味着要跳过一些障碍。sqlite数据库只是文件系统上的一个文件,所以您仍然应该检查它。另一方面,如果你想把所有东西都存储在内存中,请考虑只通过在数组和哈希表中存储绝对必要的数据来优化内存使用,然后根据需要串行化到/XML。@ IRABAXTEL:嗯,DOM文档对象不是内存中的数据库吗?如果DTD指定ID属性是什么,那么文档包含一个底层哈希集,这使得查找变得非常复杂。在给定的时间内,内存中可能有大约60个这样的文档。我可以想象一个线程使用240 MB会影响整个服务器的性能是吗?所以问题主要在于是把所有的信息都保存在内存中,还是找到一种在磁盘上快速获取信息的方法。嗯……所以基本上我应该对数据进行修剪,因为只存储必要的数据;不要使用XML。相反,我应该读取整个文件并构建Hashmaps和数组,将数据存储在内存中,以便进行查找和迭代操作。现在唯一的问题是读取文件和将字符串数据转换为上述数据结构所需的时间。希望我们能很快得到一个合适的测试环境来运行一些压力测试。谢谢你们的帮助。