optimization - 存储爬虫状态的最优化方式?

标签 optimization persistence storage web-crawler scrapy

我目前正在编写一个网络爬虫(使用 python 框架 scrapy )。
最近我不得不实现一个暂停/恢复系统。
我实现的解决方案是最简单的一种,基本上,当它们被安排时存储链接,并在它们实际存在时将它们标记为“已处理”。
因此,当恢复蜘蛛时,我能够获取这些链接(显然存储的不仅仅是 URL、深度值、链接所属的域等......),到目前为止一切正常。

现在,我一直在使用 mysql 表来处理这些存储操作,主要用于快速原型(prototype)设计。

现在我想知道如何优化它,因为我相信数据库不应该是这里唯一可用的选项。优化,我的意思是,使用一个非常简单和轻量级的系统,同时仍然能够处理在短时间内写入的大量数据

目前,它应该能够处理几十个域的爬取,这意味着每秒存储几千个链接......

提前感谢您的建议

最佳答案

持久化事物的最快方法通常是将它们附加到日志中——这种完全顺序的访问模式最大限度地减少了磁盘查找,这通常是存储时间成本的最大部分。重新启动后,您重新读取日志并重建您在最初附加到日志时也在动态构建的内存结构。

您的特定应用程序可以进一步优化,因为它不一定需要 100% 的可靠性——如果您由于突然崩溃而错过编写一些条目,嗯,您将再次抓取它们。因此,您的日志文件可以被缓冲,并且不需要过分同步。

我想搜索结构也可以很好地适应内存(如果它只适用于几十个网站,你可能只需要保留一个包含所有 URL 的集合,不需要布隆过滤器或任何花哨的东西)——如果没有,你可能只需要在内存中保留一组最近的条目,并定期将其转储到磁盘(例如,将所有条目合并到 Berkeley DB 文件中);但我不会详细介绍这些选项的细节,因为您似乎不需要它们。

关于optimization - 存储爬虫状态的最优化方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1729427/

相关文章:

linq - 使用 Entity Framework 进行动态 Linq 查询

c - 为什么在二维数组上迭代时循环的顺序会影响性能?

optimization - 告诉 LLVM 优化器变量的内容

c - 提高 SQLite 的每秒插入性能

jpa - Eclipselink : How do you get the EntityManager in each bundle?

linux - 有没有办法可以将我的 USB 闪存驱动器或其他存储设备用作运行 R 或其他编程任务的 RAM?

java - 获取文件的绝对路径[Android]

java - 持久化基类不是@Entity的对象

database - 是否需要数据库之外的事务行为?

database - Azure 上的游戏记分牌