我目前正在编写一个网络爬虫(使用python框架scrapy)。
最近,我不得不实现一个暂停/恢复系统。
我实现的解决方案是最简单的一种,基本上,在它们被调度时存储链接,并在它们实际被处理时将它们标记为“已处理”。
因此,我能够获取这些链接(显然,存储的不仅仅是URL、深度值、链接所属的域,等等)当恢复爬虫时,到目前为止一切运行正常。
现在,我一直在使用mysql表来处理这些存储操作,主要用于快速原型设计。
现在我想知道如何优化这一点,因为我认为数据库不应该是这里唯一可用的选择。所谓优化,我的意思是,使用一个非常简单和轻量级的系统,同时仍然能够在短时间内处理大量写入的数据
目前,它应该能够处理几十个域名的爬行,这意味着每秒存储几千个链接……
提前感谢您的建议
发布于 2009-11-13 23:39:50
持久化数据的最快方法通常是将它们追加到日志中--这种完全顺序的访问模式最大限度地减少了磁盘寻道,而磁盘寻道通常是存储时间开销的最大部分。在重新启动时,您将重新读取日志并重新构建内存结构,这些内存结构也是在最初添加到日志时动态构建的。
您的特定应用程序可以进一步优化,因为它不一定需要100%的可靠性--如果您由于突然崩溃而错过了几个条目,那么,您只需再次抓取它们。因此,您的日志文件可以缓冲,不需要过度fsync。
我想搜索结构也适合内存(如果它只适用于几十个站点,您可能只需要保留一个包含所有URL的集合,不需要bloom filters或任何花哨的东西) --如果不是这样,您可能只需要在内存中保留一组最近的条目,并定期将该集合转储到磁盘中(例如,将所有条目合并到一个Berkeley DB文件中);但我不打算详细介绍这些选项,因为看起来您并不需要它们。
发布于 2009-11-13 22:43:55
在PyCon 2009上有一个演讲,你可能会觉得有趣,比尔·格里布尔的Precise state recovery and restart for data-analysis applications。
保存应用程序状态的另一种快速方法可能是使用pickle将应用程序状态序列化到磁盘。
https://stackoverflow.com/questions/1729427
复制相似问题