xml - 在内存中处理大型 XML 文档

标签 xml xquery oracle-coherence

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

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

最佳答案

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

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

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

此外,如果您将灵活的 XML 数据强加到对象中,那么当您的数据结构发生变化时,您将面临一场噩梦。

您可能想查看 28msec's Scalable Database for flexible data这是云中的 PaaS。在那里,您可以立即获得所需的一切(包括负载平衡、自动恢复、持久性管理、复制、备份、自动故障转移、扩展和扩展、弹性、内存管理、分片……)。

这只是我个人的看法,但也许它至少对您的问题解决有更多的贡献。

关于xml - 在内存中处理大型 XML 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9219442/

相关文章:

c++ - 使用 C++ boost 属性树在多个标签上具有相同属性的 XML

xml - XPath选择跟随同级的子-子节点,其中跟随同级在单独的子-子节点中具有特定值

xpath - XQuery:按特定顺序查找具有后代的节点

xquery - MarkLogic - 清空大型数据库的最快方法

c# - 如何从单个应用程序连接到多个 Oracle Coherence 缓存?

topology - 一致性拓扑建议

oracle-coherence - Oracle 与 weblogic 服务器的一致性?

c# - 通过带有 XML 的 JavaScript 的 WCF 服务 - 数组参数

Python 网页抓取 - 下载文件并将所有数据存储在 xml 中

xquery - 为什么数字文字永远不能是类型 xs :positiveInteger in XQuery?