我正在寻找有关广度优先搜索流式XML文档的算法/技术的建议。
<foo>
<bar name="aaa" >
<grah name="aab" />
..
</bar>
<bar name="bbb" />
<bar name="ccc" />
<bar name="ddd" />
<bar name="eee" />
... up to 10,000 entries
</foo>
第一级元素的数量超出了我的控制范围。使用xml也是我无法控制的。我可以预处理xml,我可以索引xml,但我不能(对于可预见的未来)基于每个请求将整个xml文档加载到内存中。
我目前正在使用libxml的流读取功能顺序搜索来执行此任务。它消耗或多或少固定数量的RAM /请求,并且通常对于少于3k行的任何内容都非常敏感,并且缓存最流行的结果会有所帮助,但几乎每个顶级元素都会在某个阶段被命中。
最近,我们不得不处理一些非常大的文件,其中1级元素的大小最多为10,000个元素,并且在服务器响应方面,更接近末尾的匹配是不可接受的。
到目前为止,我已经看到Introselect和Quickselect可能会缩小搜索空间,使其变得合理。在我开始编写代码之前,我想我会看到是否还有其他想法或算法被忽略了。
答案 0 :(得分:0)
您没有详细说明搜索要求是什么或搜索的文本是什么样的。我假设XML本身并不重要,并且可以使用libxml进行解析流的连续构建对象,其中XML中的数据已经过细化并且更易于搜索。
您当然可以将XML文档插入到eXist之类的XML数据库中。如果你想保留原始的XML,这是非常灵活的,但如果你可以抛弃它,我会寻找其他方法来存储XML文档的本质;要搜索的数据。
由于您写的XML可以是预处理,我还假设XML不会经常更改。如果这些假设是正确的,您可以在搜索范围内的数据库(如Lucene)中索引要搜索的文本。您当然可以自己创建搜索算法,但由于有开源解决方案可以执行此操作(使用查询缓存和其他方法),我建议您查看一些现有的解决方案。
如果搜索本身变化不大,您还可以从XML中的数据创建JSON对象,并将其存储在具有预定义的文档数据库(如MongoDB或CouchDB)中索引几乎包含您想要在内存中执行的搜索的答案。
你应该选择哪种解决方案有点难以给出任何明确的建议,因为我不了解你的所有要求,但这些至少是你可以探索的一些想法。