我真的很喜欢Xml来保存数据,但什么时候sqlite / database成为更好的选择? 例如,当xml有多于x项或大于y MB时?

我正在编写一个rss阅读器,我相信我在sqlite数据库上使用xml来存储所有 feed项的缓存时做出了错误的选择。 有哪些一个月后有〜1MB一个XML文件,一些饲料,另外有超过700个项目,而大部分只有个月后有30〜项目,是〜大小50KB。

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

所以,我的问题是:

  1. 什么是sqlite /数据库的开销是否适合使用xml?
  2. 当有很多小文件时少数大型xml文件是否足以为数据库辩护,尽管小的文件会随着时间的推移而增长? (很长一段时间)

更新 (更多信息)

每次在GUI中选择一个订阅源时,我都会重新加载该订阅源xml文件中的所有项目。

我还需要修改读取/未读状态,当我循环遍历xml中的所有节点以查找项目然后将其设置为已读/未读时,这似乎非常糟糕。

===============>>#1 票数:38

男人我有这方面的经验。 我在一个项目上工作,我们最初使用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查询重写为复杂的多查询算法。

所以这里是我们学到的内容的总结。

  1. 对于树数据,使用XPATH查询和修改XML要容易得多。

  2. 对于小型数据集(小于10M),XML在性能上吹走了sqlite。

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

  4. 我们无法获得任何opensource xml数据库来修复与大型数据集相关的问题。

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

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

===============>>#2 票数:21 已采纳

我基本上同意Mitchel ,这可能是非常具体的,这取决于你将如何处理XML / sqlite。 对于你的情况(缓存),在我看来,使用sqlite(或其他嵌入式dbs)更有意义。

首先,我并不认为sqlite需要比XML更多的开销。 我的意思是开发时间开销和运行时开销。 唯一的问题是你对sqlite库有所依赖。 但是既然你需要一些XML库,那也没关系(我假设项目是在C / C ++中)。

sqlite优于xml的优点:

  • 一切都在一个文件中,
  • 随着缓存变大,性能损失低于XML,
  • 您可以将Feed元数据与缓存本身(其他表)分开,但可以相同的方式访问,
  • 对于大多数人来说,SQL可能比XPath更容易使用。

sqlite的缺点:

  • 多个进程访问相同的数据库可能会有问题(可能不是你的情况),
  • 你应该至少知道基本的SQL。 除非缓存中有数十万个项目,否则我认为你不需要对它进行多次优化,
  • 也许在某种程度上,从安全角度来看它可能更危险(SQL注入)。 另一方面,您不是在编写Web应用程序,因此不应该这样。

对于这两种解决方案而言,其他事情可能相同

总结一下,分别回答你的问题:

  1. 您不会知道,除非您使用两个后端测试您的特定应用程序。 否则它总是只是猜测。 对两个缓存的基本支持不应该是代码的问题。 然后基准和比较。

  2. 由于XML文件的组织方式,sqlite搜索应该总是更快(除非一些极端情况无关紧要,因为它的速度非常快)。 加快XML中的搜索需要索引数据库,在你的情况下,这意味着缓存缓存,而不是一个特别好的主意。 但是使用sqlite,您可以将索引作为数据库的一部分。

===============>>#3 票数:12

不要忘记你手边有一个很棒的数据库:文件系统!

很多程序员忘记了一个像样的目录文件结构:

  1. 这很快就像地狱一样
  2. 它是便携式的
  3. 它的运行时间很小

人们正在谈论将XML文件拆分成多个XML文件...我会考虑将XML拆分为多个目录和多个纯文本文件。

搏一搏。 它令人耳目一新。

===============>>#4 票数:6

  1. 将XML用于应用程序应该知道的数据 - 配置,日志记录以及不应该使用的数据。
  2. 将数据库(oracle,SQL server等)用于用户直接或间接交互的数据 - 真实数据
  3. 如果用户数据更多是序列化集合,则使用SQLite - 如巨大的文件列表及其内容或电子邮件项目集合等.SQLite擅长于此。

取决于数据的种类和大小。

===============>>#5 票数:5

我不会使用XML来存储RSS项目。 提要阅读器在接收数据时会不断更新。

使用XML,您需要首先从文件加载数据,解析它,然后存储它以便于搜索/检索/更新。 听起来像数据库......

此外,如果您的应用程序崩溃会发生什么? 如果使用XML,XML文件中的数据与内存中的数据的状态。 至少在SQLite中你获得了原子性,所以你可以放心,你的应用程序将以与上一次数据库写入时相同的状态开始。

===============>>#6 票数:5

当您需要将数据从应用程序移动到其他位置或在应用程序之间共享信息时,XML最适合用作交换格式。 对于几乎任何大小的应用程序,数据库应该是首选的存储方法。

===============>>#7 票数:4

何时应将XML用于数据持久性而不是数据库? 几乎从不。 XML是一种数据传输语言。 查询速度慢,查询速度慢。 解析XML(不要破坏它!)并将结果数据转换为域对象。 然后坚持域对象。 数据库持久性的一个主要优点是SQL,这意味着非结构化查询以及对常用工具和优化技术的访问。

===============>>#8 票数:2

对我来说,这取决于你在做什么,有多少用户/进程需要同时访问它们等等。

我一直使用大型XML文件,但它们是单进程,导入样式项,多用户或性能不是真正需要的。

所以它确实是一种平衡。

===============>>#9 票数:2

如果您需要缩放,请使用数据库。

===============>>#10 票数:2

XML适用于存储未完全结构化的数据,您通常希望将其与其他应用程序进行交换。 我更喜欢使用SQL数据库来处理数据。 XML容易出错,因为由于数据本身的拼写错误或遗漏而导致细微错误。 一些开源应用程序框架使用太多的xml文件来配置,数据等。我更喜欢在SQL中使用它。

既然你要求经验法则,我会说使用基于XML的应用程序数据,配置等,如果你要设置一次而不是访问/搜索它。 对于主动搜索和更新,最好使用SQL。

例如,Web服务器将应用程序数据存储在XML文件中,您实际上不需要执行复杂的搜索,更新文件。 Web服务器启动,读取xml文件,就是这样。 所以XML在这里是完美的。 假设你使用像Struts这样的框架。 开发和部署应用程序后,您需要使用XML并且操作配置不会发生太大变化。 再说一次,XML文件是一个好方法。 现在,如果您的Struts开发的应用程序允许进行大量搜索和更新,删除,那么SQL是最佳方式。

当然,您肯定会遇到组织中的一个或两个开发人员,他们只会吟唱XML或SQL,并宣称XML或SQL是唯一的方法。 要小心这些人,并为你的应用做些“感觉”。 不要只是遵循'科技宗教'。

想想您需要更新数据的频率,搜索数据的频率。 然后,您将获得有关使用内容的答案 - XML或SQL。

===============>>#11 票数:2

我已经切换到SQLite,我觉得更好地知道它在数据库中。

这有很多其他好处:

  • 添加新项目非常简单
  • 按多列排序
  • 使用唯一索引删除重复项

我创建了2个视图,一个用于未读项目,一个用于所有项目,不确定这是否是对视图的最佳使用,但我真的想尝试使用它们。

我还使用StopWatch类对xml vs sqlite进行了基准测试,并且sqlite更快, 尽管它可能只是我解析xml文件的方式不是最快的方法

  1. 小#物品和尺寸(25件,30kb)
    • ~1.5 ms sqlite
    • ~8.0毫秒xml
  2. 大量物品(700件,350kb)
    • ~20 ms sqlite
    • ~25毫秒xml
  3. 文件很大(850项,1024kb)
    • ~45 ms sqlite
    • ~60毫秒xml

===============>>#12 票数:1

我同意@Bradley。

XML非常慢,并且作为存储格式不是特别有用。 何必呢? 您是否会使用文本编辑器手动编辑数据? 如果是这样,与YAML相比,XML 仍然不是一种非常方便的格式。 使用像SQlite这样的东西,查询更容易编写,并且有一个定义良好的API用于获取和输出数据。

如果您需要在程序之间发送数据,XML就可以了。 但是,就效率而言,您应该在发送时生成XML,并在接收时将其解析为“真实数据”。

以上所有意味着您的问题“当数据库的开销合理时”是有点没有意义的。 与SQlite相比,XML总是有更高的开销。 (像MSSQL这样的完整数据库比较重,特别是在管理开销方面,但这是一个完全不同的问题。)

===============>>#13 票数:1

XML可以存储为文本和二进制文件格式。

如果您的主要目标是让计算机有效地读/写文件格式,那么您应该使用二进制文件格式。

数据库是一种易于使用的存储和维护数据的方式。 它们不是存储二进制文件格式数据的最快方法。

什么可以加快速度是使用内存数据库/数据库类型。 Sqlite有这个选项。

这听起来像是为你做这件事的最佳方式。

===============>>#14 票数:1

我的意见是,您不应该在不需要纯文本文件格式的情况下使用SQLite(或其他适当的嵌入式数据库)。 请注意,这是一个非常大的例外。 有许多场景需要纯文本格式或受益于纯文本格式。

就开销而言,SQLite使用普通标志编译为250 k。 许多XML解析库都比SQLite大。 使用XML不会获得并发收益。 SQLite二进制文件格式将支持更高效的写入(主要是因为您无法附加到格式良好的XML文件的末尾)。 甚至读取数据,我认为大多数是相当随机的访问,使用SQLite会更快。

最重要的是,您可以获得SQL的好处,如事务和索引。

编辑:忘了提。 SQLite(与许多数据库相对)的一个好处是它允许任何列中任何行中的任何类型。 基本上,使用SQLite,您可以在数据类型方面获得与XML相同的自由。 这也意味着您不必担心对文本列设置限制。

===============>>#15 票数:1

您应该注意,许多大型关系数据库(Oracle和SQLServer)具有XML数据类型,用于在数据库中存储数据,并在SQL语句中使用XPath来访问该数据。

此外,有一些本机XML数据库与SQLite非常相似,因为它们是一个包含文档集合的二进制文件(大致可以是一个表),然后您可以在单个文档或整个集合上使用XPath / XQuery。 因此,使用XML数据库,您可以将日期数据存储为集合中的单独XML文档...因此,在处理当前数据时,您只需使用该文档。 但是编写一个XQuery来计算该人文档集的历史数据。 油滑。

我使用过Berkeley XMLDB(现在由Oracle支持)。 如果您搜索谷歌搜索“原生XML数据库”,还有其他人。 我没有看到以这种方式存储/检索数据的性能问题。

XQuery是一个不同的野兽(但值得学习),但是你可以只使用你目前使用的XPath稍作修改。

===============>>#16 票数:1

作为程序的一部分,数据库非常棒。 如果查询数据是业务逻辑的一部分。 XML最适合作为文件格式,特别是如果您的数据格式是:

1,Hierarchal
2,可能在未来以你无法猜测的方式改变
3,数据的寿命比程序长

===============>>#17 票数:0

我说这不是数据大小的问题,而是数据类型的问题。 如果您的数据是结构化的 ,请使用关系数据库。 如果您的数据是半结构化的 ,那么使用XML或 - 如果数据量实际上变得太大 - 使用XML数据库。

===============>>#18 票数:0

如果您的搜索使用数据库。 您可以将xml文件拆分为目录以方便查找,但管理开销很容易变得很重。 你还可以获得更多不仅仅是使用sql db的性能......

  ask by sieben translate from so

未解决问题?本站智能推荐:

1回复

Android-小型数据库-XML与SQLite

我有一个关于android中数据存储的问题,希望能在这里得到一些帮助。 我尝试搜索它,但是找不到特定于我的问题的任何东西。 如果我错过了什么,请随时为我指出正确的方向。 我是android编程的新手,主要有C ++和C#的经验。 在我的第一个项目中,我选择了一些小东西。 我想为
1回复

订购了SQlite数据库(基于XML提要)

我正在开发我的第一个android应用程序,以前从未真正使用过数据库。 无论如何,我需要根据定期(例如每天一次)从Web检索到的XML文件填充和更新数据库。 只是考虑一下,iv已经遇到了一些问题...基本上,我需要显示有关艺术家和按日期排序的事件的信息。 为此,我计划通过sqlite数
3回复

使用python将数据从xml文件填充到sqlite数据库

我有一个问题涉及解决问题的一些指导。 我有一个xml文件,我必须使用脚本语言填充到数据库系统(无论是,它可能是sqlite,mysql):Python。 有没有人知道如何进行? 我需要进一步阅读哪些技术? 我必须安装哪些环境? 关于同一主题的任何教程?
1回复

如何将数据从XML文件存储到android中的SQLite数据库

我正在开发一个应用程序 - 当用户成功登录时,将从URL获取XML文件,并在列表视图中显示XML数据。 如何在SQLite数据库中存储该数据,以便脱机用户可以看到存储在数据库中的数据? 我还想创建一个刷新按钮,它会显示一个更新的XML文件,并在单击时将其存储在SQLite中。
1回复

将Web上的整个xml文件解析为sqlite数据库

我目前正在做一个小项目。 我想用sqlite创建一个自我更新的数据库。 我正在使用的数据是每日国库券收益率曲线( https://www.treasury.gov/resource-center/data-chart-center/interest-rates/Pages/TextView.
3回复

我可以将HTML作为XML存储在Sqlite3数据库中吗?

是否有可能做到这一点? 有问题的HTML文件都符合: 编辑:如何将多个具有顺序ID的HTML页面存储在数据库中? (哦,我是数据库新手)。 编辑:现在我意识到SQlite没有“ xml”数据类型。 我打开了错误的数据源!
5回复

XML作为数据库

我一直在阅读有关XML,XSL,XPath等的信息。我想使用XML作为数据库启动PHP中的这个小脚本,以创建一个简单的CRUD应用程序。 我将使用SimpleXML,但是在阅读了stackoverflow的一些答案之后,似乎很多人建议使用DOMDocument(使用DOMDocument会比S
7回复

XML与数据库

因此,我开始学习XML。 似乎是一个简单的平面文件数据系统,您可以使用所选的服务器端语言并进行一些分析来查看其输出。 我真的没有看到使用XML比将值存储在数据库中并进行相同类型的解析的好处。 我的意思是,数据库似乎会更快。 那么,您真正可以使用XML却不能/不应该对数据库做什么呢?
3回复

到PostgreSQL数据库的XML数据[关闭]

已关闭 。 这个问题需要更加集中 。 它当前不接受答案。 想改善这个问题吗?
1回复

XML vs JSON表示数据库数据[关闭]

我试图了解这两种技术中的哪一种,XML或JSON,更适合用于来自数据库的数据。 我需要解析其中一个文件中的数据并将其用于我的程序。 我正在尝试查看哪些API应该考虑易用性和设计视角。