有效地搜索大量URL列表
Efficiently searching a large list of URLs
我正在构建一个必须爬行数百个网站的网络爬行者。我的爬行者保留了已经爬行的URL列表。每当Crawler要爬一个新页面时,它首先搜索已经爬网的URL列表,如果已经列出了爬网手,则跳到下一个URL等。一旦URL爬行,就会添加到列表中。
当前,我正在使用二进制搜索来搜索URL列表,但是问题是一旦列表增长,搜索就会变得非常慢。因此,我的问题是,我可以使用哪种算法来搜索URL列表(列表的大小增加到约20k至100k)。
Crawler目前在Python中进行了编码。但是我要将其移植到C 或其他更好的语言。
您必须在某个时候决定要爬行的列表变成多大。您最多可以将URL存储在哈希地图或字典中,这可能会给您o(1)查找。
。无论如何,平均URL长度约为80个字符(这是我五年前我运行分布式爬行者的经验),您只会获得每GB的大约1000万个URL。因此,您必须开始考虑压缩数据或允许在一段时间后重新爬行。如果您每天只添加100,000个URL,那么您将需要100天才能爬行1000万个URL。这可能是足够的时间来允许重新爬行。
如果这些是您的局限性,那么我建议由URL键入的简单词典或哈希地图。该值应包含最后的爬网日期以及您认为要保留的任何其他信息。将数据结构限制为1000万个URL。它可能会吞噬近2 GB的空间,而字典的头顶等等。
您必须定期修剪它。我的建议是要有一个计时器每天运行一次,并清理x天以上X的所有URL。在这种情况下,您可能会将X设置为100。
如果您开始谈论每天执行数百万个URL的高容量爬行者,那么您会涉及更多参与的数据结构和创新方法来管理复杂性。但是从您的问题的语气来看,这不是您感兴趣的。
我认为在将您的值放入您的二进制搜索列表之前,我认为将其值放在二进制搜索列表中 - 这将摆脱可能的字符串比较的瓶颈,交换为INT平等检查。它还可以使O(log2(n))二进制搜索时间 - 如果您在运行之间使用Python的内置hash()
,则可能不会获得一致的结果,但是 - 它是特定于实现的。在运行中,这将是一致的。总是可以选择实现自己的哈希,这也可以在会话之间保持一致。
- Pybind11:将元组列表从Python传递到C++
- 从链接列表c++中删除一个项目
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- C++如何通过用户输入删除列表元素
- 读取文件的最后一行并输入到链接列表时出错
- 复制列表初始化的隐式转换的等级是多少
- LNK2038、MSVS2017 MAGMA的原因列表
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 没有为自己的结构调用列表推回方法
- 使用简单类型列表实现的指数编译时间.为什么
- 一对向量构造函数:初始值设定项列表与显式构造
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 通过for循环使用用户输入填充列表
- C++:如何使函数只返回作为列表一部分的字符串
- 概念中的cv限定符需要表达式参数列表
- 下面是我为检测链接列表中的循环而制作的代码
- 建议在运行时将带有类实例的列表从c++导入qml
- 如何维护资源管理器项目视图中当前可见的项目列表
- 在卡萨布兰卡形成编码参数的列表
- 有效地搜索大量URL列表