在内存中处理大型XML文档

时间:2012-02-09 21:57:28

标签: xml xquery oracle-coherence

我需要在内存中保存大量的XML(最有可能将Oracle Coherence用作分布式缓存)。期望是在内存中保存100,000个XML。这些XML非常大 - 约。每个250KB。其他系统要求这些XML - 它们只要求与它们相关的部分XML。此外,他们还会要求更改XML的内容。负载将是每分钟约300个此类请求,在检索和更新之间或多或少地均匀分布。一个重要的注意事项是XML不是结构化的,因此我不会为它们提供XSD,但我确实有算法来提取和更新XML。

我的问题是什么会产生更好的性能:将XML保持在内存中,并使用XQuery或甚至使用编码过程从它们和更新中提取所有数据,或者将XML转换为对象,在代码中操作它们,然后在其他系统请求时将它们转换回XML?

2 个答案:

答案 0 :(得分:7)

您有100,000个文档,250 KB。这大约是24 GB的原始数据。如果你把它放在内存中并且希望能够处理,过滤或更新它,那么你将拥有额外的爆发因子,比如说10.然后你最终得到240 GB的所需内存容量。

所以,如果你有足够的可用内存,这当然是最好的举办地点。但是你需要有一个回退策略(如果节点的数量超出内存会发生什么?)如果你不想丢失更新它会变得更加复杂:如果机器崩溃会怎么样?如果更新内存:何时刷新磁盘更新?还有更多的事情要考虑。

然而,要回答你的第二个问题:转换成对象与否?大多数人都倾向于使用PHP,ruby,Java,“.NET”等将XML转换为对象,甚至将XML存储在SQL数据库中。如果你想听到一个诚实的答案:如果你没有足够的时间和金钱浪费,就不要这样做。对象引入了额外需要的分析,设计,解析,编组,测试,维护的大量开销......事实上,这完全消除了XML的灵活性,我看到这种情况经常被低估。根据我使用XML和XQuery的经验,我为上面列出的内容节省了平均约80%

此外,如果您将灵活的XML数据强制转换为对象,那么如果您的数据结构发生变化,您将面临噩梦。

您可能想要查看云中的PAAS 28msec's Scalable Database for flexible data。在那里,您可以获得开箱即用的所有功能(包括负载均衡,自动恢复,持久性管理,复制,备份,自动故障转移,扩展和扩展,弹性,内存管理,分片......)。

这只是我个人的意见,但也许它至少会为你的问题解决方案提供更多方面。

答案 1 :(得分:0)

我的猜测是内存会更快(如果你有足够的空间)。 但是,由于所有的性能问题都存在很大的问题,这取决于"您需要分析实际用法。