4

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

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

4

2 回答 2

7

您有 100,000 个文档和 250 KB。这使得大约。24 GB 的原始数据。如果您将其放入内存并希望能够处理、过滤或更新它,您将拥有额外的爆破系数,假设为 10。那么您最终将获得 240 GB 的所需内存容量。

因此,如果您有足够的可用内存,那当然是存放它的最佳位置。但是你需要有一个回退策略(如果节点数量增长到内存不足会发生什么?)如果你不想丢失更新,它会变得更加复杂:如果机器发生故障会发生什么?如果您在内存中更新:您何时将更新刷新到磁盘?还有更多的事情需要考虑。

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

此外,如果您将灵活的 XML 数据强制转换为对象,那么如果您的数据结构不断发展,您将面临一场噩梦。

您可能想查看28msec 的 Scalable Database 以获得灵活的数据,它是云中的 PAAS。在那里,您可以获得开箱即用的一切(包括负载平衡、自动恢复、持久性管理、复制、备份、自动故障转移、伸缩、弹性、内存管理、分片......)。

这只是我个人的意见,但也许它至少对您的问题解决方案有更多的帮助。

于 2012-02-13T19:22:55.913 回答
0

我的猜测是它在内存中会更快(如果你有足够的空间)。但是对于所有性能问题,这都带有一个很大的“取决于”。您需要分析实际使用情况。

于 2012-02-09T22:01:10.703 回答