Xml 或 Sqlite,何时为数据库删除 Xml?

标签 xml database

<分区>

我真的很喜欢 Xml 来保存数据,但是什么时候 sqlite/database 会成为更好的选择呢?例如,当 xml 包含超过 x 个项目或大于 y MB 时?

我正在编写一个 rss 阅读器,我相信我在使用 xml 而不是 sqlite 数据库来存储 所有 提要项目的缓存时做出了错误的选择。有一些 feeds 在一个月后有一个 ~1mb 的 xml 文件,另一个有 700 多个项目,而大多数只有 ~30 个项目,并且在 几个月 后大小为 ~50kb。

我目前没有实现上限的计划,因为我希望能够搜索所有内容。

所以,我的问题是:

  1. 什么时候 sqlite/数据库的开销比使用 xml 合理?
  2. 当有很多小文件时,几个大的 xml 文件是否足以证明数据库的合理性,尽管即使是小文件也会随着时间的推移而增长? (很长的很长的时间)

已更新(更多信息)

每次在 GUI 中选择提要时,我都会重新加载该提要 xml 文件中的所有项目。

我还需要修改已读/未读状态,当我循环遍历 xml 中的所有节点以查找项目然后将其设置为已读/未读时,这看起来真的很老套。

最佳答案

伙计,我有这方面的经验。我在一个项目中工作,我们最初使用 XML 存储所有数据,然后转移到 SQLite。每种技术都有很多优点和缺点,但导致转换的是性能。这是我们观察到的。

对于小型数据库(几兆或更小),XML 速度更快,也更容易处理。我们的数据自然采用树格式,这使 XML 更具吸引力,而 XPath 允许我们在一行中执行许多查询,而不必沿着祖先树走下去。

我们在 Win32 环境中编程,并使用标准的 Microsoft DOM 库。我们会将所有数据加载到内存中,将其解析为 DOM 树,然后在内存副本上进行搜索、添加和修改。我们会定期保存数据,并且需要轮换副本以防机器在写入过程中崩溃。

我们还需要使用 C++ TreeMap 手动构建一些“索引”。这对于 SQL 来说当然是微不足道的。

请注意,文件系统上的数据大小比“内存中”DOM 树小 2-4 倍。

当数据达到 10M-100M 大小时,我们开始遇到真正的问题。有趣的是,在所有数据大小下,XML 处理都比 SQLite 快得多(因为它在内存中,而不是在硬盘驱动器上)!问题实际上是双重的——首先,加载时间真的开始变长了。在数据进入内存并构建 map 之前,我们需要等待一分钟左右。当然,一旦加载程序就非常快。第二个问题是所有这些内存一直都被占用。即使我们运行得非常快,只有几百兆的系统在其他应用程序中也会无响应。

我们实际上正在研究使用基于文件系统的 XML 数据库。有几个开源版本的 XML 数据库,我们试过了。我从未尝试过使用商业 XML 数据库,所以我无法对它们发表评论。不幸的是,我们根本无法让 XML 数据库正常工作。甚至用数百兆的 XML 填充数据库的行为也需要数小时……也许我们使用不正确。另一个问题是这些数据库非常重量级。他们需要 Java 并拥有完整的客户端服务器架构。我们放弃了这个想法。

然后我们找到了SQLite。它解决了我们的问题,但也付出了代价。当我们最初插入 SQLite 时,内存和加载时间问题就消失了。不幸的是,由于所有处理现在都在硬盘驱动器上完成,因此后台处理负载大大增加。早些时候我们甚至从未注意到 CPU 负载,但现在处理器使用率大幅上升。我们需要优化代码,并且仍然需要在内存中保留一些数据。我们还需要将许多简单的 XPath 查询重写为复杂的多查询算法。

下面是我们所学内容的总结。

  1. 对于树数据,XML 使用 XPath 更容易查询和修改。

  2. 对于小型数据集(小于 10M),XML 在性能上击败了 SQLite。

  3. 对于大型数据集(大于 10M-100M),XML 加载时间和内存使用成为一个大问题,以至于某些计算机变得无法使用。

  4. 我们无法获得任何开源 XML 数据库来解决与大型数据集相关的问题。

  5. SQLite 没有 XML DOM 的内存问题,但它处理数据的速度通常较慢(它在硬盘驱动器上,而不是在内存中)。 (注意 - SQLite 表可以存储在内存中,也许这会使它变得更快......我们没有尝试这个因为我们想从内存中获取数据。)

  6. 在表中存储和查询树数据并不令人愉快。然而,管理事务和索引部分弥补了这一点。

关于Xml 或 Sqlite,何时为数据库删除 Xml?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8990488/

相关文章:

xml - 从 XML 中选择节点,其属性之一包含特定字符串

android - 带有前缀和自闭标记的 XMLPullParser

database - 小于 1.0 的数字字段的 Delphi TFloatField.DisplayFormat

database - 你如何测试你的数据库设计?

c# - 如何连接到本地SQL数据库?

java - 提供 JSON/XML 等服务的 Web 服务。回应

c# - 如何在 SilverLight 项目中使用 XDocument 类 (C#)

mysql - 简单的关系型数据库规划建议

xml - 从 XDocument 中删除 XElement

mysql - 使用 JOINS、ORDER BY 和数据透视表