就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、参考资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,访问帮助中心 以获得指导。
我真的很喜欢 Xml 来保存数据,但是 sqlite/database 什么时候成为更好的选择?例如,当 xml 超过x 项或大于y MB?
我正在编写一个 RSS 阅读器,我相信我在使用 xml 而不是 sqlite 数据库来存储缓存时做出了错误的选择all 提要项目。有些提要在一个月后的 xml 文件大小约为 1mb,另一些则有超过 700 个项目,而大多数提要只有约 30 个项目,并且在一个月后大小约为 50kb。several 几个月。
我目前没有计划实施上限,因为我喜欢能够搜索所有内容。
所以,我的问题是:
什么时候 sqlite/数据库的开销比使用 xml 更合理?
Are the 一些大的 xml 文件 当存在时,数据库有足够的理由很多小 那些,尽管即使是很小的也会随着时间的推移而长大? (沿着long time)
updated (更多信息)
每次在 GUI 中选择 feed 时,我都会重新加载该 feeds xml 文件中的所有项目。
我还需要修改已读/未读状态,当我循环遍历 xml 中的所有节点以查找该项目,然后将其设置为已读/未读时,这看起来确实很麻烦。
伙计,我有这方面的经验吗?我从事的一个项目最初使用 XML 存储所有数据,然后迁移到 SQLite。每种技术都有很多优点和缺点,但正是性能导致了这种转变。这是我们观察到的情况。
对于小型数据库(几兆或更小),XML 速度更快,并且更容易处理。我们的数据自然采用树格式,这使得 XML 更具吸引力,并且 XPath 允许我们在一行简单的代码中执行许多查询,而不必沿着祖先树走下去。
我们在 Win32 环境中进行编程,并使用标准的 Microsoft DOM 库。我们将所有数据加载到内存中,将其解析为 DOM 树,并在内存副本上搜索、添加、修改。我们会定期保存数据,并且需要轮换副本,以防机器在写入过程中崩溃。
我们还需要使用 C++ 树图手动构建一些“索引”。当然,这对于 SQL 来说是微不足道的。
请注意,文件系统上的数据大小比“内存中”DOM 树小 2-4 倍。
当数据达到 10M-100M 大小时,我们开始遇到真正的问题。有趣的是,对于所有数据大小,XML 处理都比 SQLite 快得多(因为它在内存中,而不是在硬盘上)!问题实际上有两个:首先,加载时间确实开始变长。在数据存入内存并构建地图之前,我们需要等待一分钟左右。当然,一旦加载程序就非常快。第二个问题是所有这些内存一直都被占用。即使我们运行得非常快,只有几百兆的系统在其他应用程序中也会没有响应。
我们实际上正在研究使用基于文件系统的 XML 数据库。有几个开源版本的 XML 数据库,我们尝试过。我从未尝试过使用商业 XML 数据库,所以我无法对它们发表评论。不幸的是,我们根本无法让 XML 数据库正常工作。甚至用数百兆 XML 填充数据库的操作也需要几个小时……也许我们使用得不正确。另一个问题是这些数据库非常重量级。他们需要 Java 并拥有完整的客户端服务器架构。我们放弃了这个想法。
然后我们发现了 SQLite。它解决了我们的问题,但付出了代价。当我们最初插入 SQLite 时,内存和加载时间问题就消失了。不幸的是,由于所有处理现在都在硬盘上完成,因此后台处理负载大幅增加。虽然之前我们从未注意到 CPU 负载,但现在处理器使用率大幅上升。我们需要优化代码,并且仍然需要在内存中保留一些数据。我们还需要将许多简单的 XPath 查询重写为复杂的多查询算法。
以下是我们所学到的内容的总结。
对于树数据,使用 XPath 查询和修改 XML 更加容易。
对于小型数据集(小于 10M),XML 的性能远远超过 SQLite。
对于大型数据集(大于 10M-100M),XML 加载时间和内存使用成为一个大问题,甚至导致某些计算机无法使用。
我们无法获得任何开源 XML 数据库来解决与大型数据集相关的问题。
SQLite 没有 XML DOM 的内存问题,但它处理数据的速度通常较慢(它在硬盘上,而不是在内存中)。 (注意 - SQLite 表可以存储在内存中,也许这会让它变得更快......我们没有尝试这个,因为我们想从内存中获取数据。)
在表中存储和查询树数据并不令人愉快。然而,管理事务和索引可以部分弥补这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)