【问题标题】:Is there a more efficient way of querying HTML data than in an SQlite database?有没有比在 SQlite 数据库中查询 HTML 数据更有效的方法?
【发布时间】:2012-09-13 03:52:15
【问题描述】:

也许我的问题将被关闭,因为它不够“建设性”,但无论如何......我已经搜索过答案,但其中大多数都过于笼统。对于我的硕士论文项目,我必须抓取大量(即数千个)网页并将它们完全存储在数据库中。这是必要的,因为我必须以不同的方式分析它们,尝试几种机器学习算法并以不同的方式解析它们。目前,我正在为此使用 SQlite 数据库,并结合 Django 作为首选的 Web 框架。

我已将单个网页的整个 HTML 数据放入 Django TextField,即对于每个网页,数据库表中都有单独的行,并且所有网页的内容都存储在表的单个列中。现在的问题是查询和排序数据,尤其是迭代数据非常慢。到目前为止,我已经抓取了大约 1000 个网页,并且数据库文件的大小已经超过 2 GB。此外,我的 4 GB RAM 被完全填满,我的电脑(Macbook Pro 2009 年中,Core2Duo 2.26 Ghz,500 GB 硬盘,OSX 10.8)变得无响应。如果我限制要预缓存的项目数量,那么处理数据会变得更慢,因为查询数量会增加。由于我必须抓取更多数据,因此我当前的设置无法很好地扩展。

我现在的问题如下: 如何更有效地存储我的 HTML 数据,以便更快地完成数据查询?切换到另一个 RDBMS(如 MySQL 或 PostgreSQL)是否有意义?或者你会推荐一个面向文档的数据库系统,比如 MongoDB?到目前为止,我只有使用 SQlite 的经验,所以我真的不知道该使用什么。由于我的硕士论文的截止日期越来越近,我没有时间尝试许多不同的设置。

为了帮助您帮助我,这里有一些进一步的要求:

  • 与 SQlite 相比,查询大型 HTML 数据的性能更高,同时不会占用我计算机的所有内存(工作负载无法分配到其他计算机)
  • 与 Django 或多或少的良好集成
  • 这只是研究工作,因此它永远不会在生产环境中运行,而只能在我的计算机上运行(可能也在我教授的计算机上)

如果你能帮助我决定我应该走哪个方向,那就太好了,因为我对这么多的可能性感到不知何故迷失了方向。非常感谢您! :)

【问题讨论】:

  • 你在html页面中查询的是什么数据?您正在执行一些基本的文本搜索吗?
  • @Jeremy 文本搜索是其中的一部分,是的,但我还必须分析网页的 HTML 结构并将其用作几种机器学习算法的训练数据。这就是我必须存储网页的原因完整,而不仅仅是文字内容。
  • 许多数据库(MySQL、SQLAnywhere、MS-SQL Server 等)提供内置函数来帮助解析 XML 数据,这可能会有一些用处(前提是 HTML 格式良好... )。从理论上讲,这会缩短您的查询时间,具体取决于您所追求的...
  • 另一种想法是根据“典型”组件将网页分开,并将它们分开存储(即分别存储“head”和“body”节点)。如果有必要,这将在查找其中一项内容时缩短查询时间。
  • @PeterStahl lxml 看起来可以正常工作,但是使用原生支持 XML 的数据库的想法是,它不仅可以减少执行查询所花费的时间,还有在数据库和程序之间传输结果的时间(这取决于结果集的大小,可能非常重要)。你现在对数据库进行什么类型的操作?选择哪里喜欢?正则表达式?

标签: database django sqlite database-design document-oriented-db


【解决方案1】:

这只是一个答案,但您应该考虑一些建议。您的问题远不能通过 code-sn-p 或提示来解决。

首先:尽量减少获取的数据。 这就是说,为什么要存储完整的 HTML 代码,我猜你只对网页上发布的文本(又名内容)感兴趣。因此,在抓取期间从 HTML 内容中剥离数据并存储纯信息。 如果我错了,并且您对其他内容感兴趣,请随时纠正我。

第二:尝试产生可查询的数据。您的爬虫应该以您可以更轻松地处理数据的方式将数据写入数据库。 map-reduce 方法可能是要走的路。这将花费更多时间进行爬网,但之后可以快速检索数据。 这几乎只存储了您抓取的所有页面的地图,而不是完整的内容,或者至少,您的查询不会触及完整的数据表,并且只依赖于 mapreduceed 内容。

第三:升级您的硬件 - 您想处理大量数据吗?做好准备(或带上时间)。将尽可能多的 RAM 插入 Macbook(您可以将 ram 放入其中吗?!请说您可以在苹果的东西中升级 ram ..),因为它真的很便宜

第四:SQLite 是硬盘重的,因为它依赖于操作系统 io-cache 等,有时需要很长时间才能重新获取数据。 如果您可以尝试将它放在 SSD 驱动器上(从长远来看,这对 SSD 来说是不健康的 ;-))或使用快速连接到您的 PC 的远程数据库,因此 hdd->ram->cpu 周期是不是你的限制,但只有 RAM 和 CPU(我猜你的程序不是多核的,对吧?)

第五个也是最后一个:尽管我讨厌现在到处都在使用花哨的词,但请看一下 IBM 关于 hadoop 的文章

【讨论】:

  • 感谢您的详细回答。 :) 关于您的第一点,我还必须分析网页的 HTML 结构,而不仅仅是文本内容。这就是为什么我必须完整地存储这些页面。如果我只需要文本,我肯定会去掉 HTML 内容。关于您的第三点和第四点:我目前没有钱购买 SSD 或升级我的 RAM。不,我的程序不是基于多核功能。这是一个网络应用程序(特别是搜索引擎)。
猜你喜欢
  • 2020-07-22
  • 2023-03-07
  • 2013-10-10
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多