2

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

我已将单个网页的整个 HTML 数据放入 DjangoTextField中,即对于每个网页,数据库表中都有单独的行,所有网页的内容都存储在表的单个列中。现在的问题是查询和排序数据,尤其是迭代数据非常慢。到目前为止,我已经抓取了大约 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 或多或少的良好集成
  • 这只是研究工作,因此它永远不会在生产环境中运行,而只能在我的计算机上运行(也许也在我教授的计算机上)

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

4

1 回答 1

2

这只是一个答案,但您应该考虑的建议。您的问题远不能通过代码片段或提示来解决。

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

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

第三:升级你的硬件——你想处理很多数据吗?做好准备(或带上时间)。尽可能多地插入你想要的内存,并且可以到你的 Macbook(你可以把内存放在里面吗?!请说你可以升级苹果的内存..)因为它真的很便宜

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

五分之一和决赛:尽管我讨厌现在到处都在使用花哨的词,但请看一下 IBM 关于hadoop的文章

于 2012-09-20T18:33:49.907 回答