也许我的问题将被关闭,因为它不够“建设性”,但无论如何......我已经搜索了答案,但大多数都太笼统了。对于我的硕士论文项目,我必须抓取大量(即数千个)网页并将它们完全存储在数据库中。这是必要的,因为我必须以不同的方式分析它们,尝试几种机器学习算法并以不同的方式解析它们。目前,我正在使用SQlite数据库,将Django与首选的Web框架结合使用。
我将单个网页的整个HTML数据放入Django TextField
,即对于每个网页,数据库表中都有一个单独的行,所有网页的内容都存储在一个列中。表。现在的问题是查询和排序数据,特别是迭代数据非常慢。到目前为止,我已经抓取了大约1000个网页,数据库文件的大小已超过2 GB。此外,我的4 GB RAM完全填满,我的电脑(Macbook Pro 2009年中期,Core2Duo 2.26 Ghz,500 GB HDD,OSX 10.8)变得无法响应。如果我限制要预先缓存的项目数,那么处理数据会变得更慢,因为查询数量会增加。由于我必须抓取更多数据,因此我当前的设置无法很好地扩展。
我现在的问题如下: 如何更有效地存储我的HTML数据,以便更快地查询数据?切换到另一个RDBMS如MySQL或PostgreSQL是否有意义?或者你会推荐一个面向文档的数据库系统,如MongoDB?到目前为止我只有SQlite的经验,所以我不知道该使用什么。由于我的硕士论文的截止日期越来越近,我没有时间尝试很多不同的设置。
为了帮助您,我们提供了一些进一步的要求:
如果你帮助我决定我应该采取哪个方向,那将会很棒,因为我觉得这种方式有很大的可能性。非常感谢你提前! :)
答案 0 :(得分:2)
这只是一个答案,但你应该考虑的建议。您的问题远非特定于使用代码段或提示进行处理。
首先:尝试尽可能减少提取的数据。 这说,为什么存储完整的HTML代码,我猜你只对网页上发布的文字感兴趣(又名内容)。因此,在爬行期间从HTML内容中剥离数据并存储纯信息。 如果我错了,你对其他事情感兴趣,请随时纠正我。
第二:尝试生成可查询的数据。您的爬虫应该以一种可以更轻松地处理数据的方式在数据库中写入数据。可以采用减少地图的方法。这将需要更多时间爬行,但之后可以快速恢复数据。 这几乎只存储了您抓取的所有页面的地图,而不再是完整的内容,或者至少,您的查询不会触及整个数据表,而只是首先依赖mapreduced内容。
第三次:升级您的硬件 - 您想要处理大量数据?做好准备(或与你共度时光)。坚持尽可能多的内存,你可以使用你的Macbook(你可以把ram放在右边吗?!请说你可以升级ram in apple stuff ..)因为它真的很便宜
第四:SQLite很重,因为它依赖于OS io-cache等等,有时需要很长时间才能重新获取数据。 如果你可以尝试在SSD驱动器上获取它(从长远来看这对SSD来说是不健康的;-))或者使用一个快速连接到你的电脑的远程数据库,那么hdd-> ram-> cpu循环不是你的限制,只有RAM和CPU(我猜你的程序不是多核的吗?)
五分之一决赛:即使我讨厌现在到处都是媒体中的幻想,请看看IBM关于hadoop的文章