需要想法使用优先级队列在数据结构中自定义算法
Need Idea to customize an Algorithm in Data Structure Using Priority Queue
我正在使用优先队列开发网络抓取算法。我有一个种子URL,我根据算法解析了它所有的link。然后我根据他们从算法中获得的分数将所有解析的 URLs 放入优先级队列中。算法根据 links 分数从优先队列开始 select 新种子 URL。当 link 被 select 编辑为种子 URL 时,它会从优先队列中出队,依此类推。该程序 运行ning 没有任何问题。但问题是:
由于enqueue Links操作数越来越多,dequeue Links操作数越来越多,Priority Queue的大小也越来越大。我怎样才能控制它?优先队列的大小是否会影响我的爬虫的性能?
当我尝试获取每分钟 URL 的爬网次数时,我得到的结果很低。例如:运行 运行程序 1 小时后,爬网页面的平均值比我 运行 程序运行 15 分钟并获取爬网页面的平均值要低。发生这种情况是因为 Priority Queue size 吗?如何解决这个问题?
我有这两个问题,需要你的帮助和你的想法来解决我的抓取算法中的这个问题。
优先级队列的大小显然会变大,因为页面通常包含多个页面 link。这基本上是对由页面及其包含的其他 URL 引起的整个图表的搜索,因此使用您当前的算法,您最终将遍历整个图表。可能只找出每个页面的前 N links,然后只关注那些。
关于速度。访问网站是可并行化的,因此您可以从它开始,比如说,总是一次抓取 k
links。否则,您是否正在使用优先级队列的良好实现?您是否正确关闭了程序打开的所有网络连接?
正如 rafalio 指出的那样,您的队列的大小将不断增加,因为平均网页包含超过 1 个出站 link,并且您不会在整个互联网上关闭 :-)
但是,与其像 rafalio 建议的那样从每个页面搜索前 N link,我建议您为优先级队列设置一个全局最大上限(例如 30,000)。这样,当它开始增长时,您遍历的每个新 link(队列中下一个最高优先级 link)将积累越来越大的相对于迄今为止遇到的其他所有事物的相对优先级。您几乎可以肯定,当队列达到上限时,其中优先级最高的项目将比当前页面(或您接下来可能访问的任何任意页面)上的前 N link 更重要。
请记住,如果您的优先级队列是支持数组的,则插入和删除操作将为 O(n)。排序的 linked 列表也将有 O(n) 的插入时间。二进制堆支持的优先级队列应该为大 n 提供最好的整体性能,在插入和删除时不比 O(log n) 差,并且 O (1) min/max 项查找。
我正在使用优先队列开发网络抓取算法。我有一个种子URL,我根据算法解析了它所有的link。然后我根据他们从算法中获得的分数将所有解析的 URLs 放入优先级队列中。算法根据 links 分数从优先队列开始 select 新种子 URL。当 link 被 select 编辑为种子 URL 时,它会从优先队列中出队,依此类推。该程序 运行ning 没有任何问题。但问题是:
由于enqueue Links操作数越来越多,dequeue Links操作数越来越多,Priority Queue的大小也越来越大。我怎样才能控制它?优先队列的大小是否会影响我的爬虫的性能?
当我尝试获取每分钟 URL 的爬网次数时,我得到的结果很低。例如:运行 运行程序 1 小时后,爬网页面的平均值比我 运行 程序运行 15 分钟并获取爬网页面的平均值要低。发生这种情况是因为 Priority Queue size 吗?如何解决这个问题?
我有这两个问题,需要你的帮助和你的想法来解决我的抓取算法中的这个问题。
优先级队列的大小显然会变大,因为页面通常包含多个页面 link。这基本上是对由页面及其包含的其他 URL 引起的整个图表的搜索,因此使用您当前的算法,您最终将遍历整个图表。可能只找出每个页面的前 N links,然后只关注那些。
关于速度。访问网站是可并行化的,因此您可以从它开始,比如说,总是一次抓取 k
links。否则,您是否正在使用优先级队列的良好实现?您是否正确关闭了程序打开的所有网络连接?
正如 rafalio 指出的那样,您的队列的大小将不断增加,因为平均网页包含超过 1 个出站 link,并且您不会在整个互联网上关闭 :-)
但是,与其像 rafalio 建议的那样从每个页面搜索前 N link,我建议您为优先级队列设置一个全局最大上限(例如 30,000)。这样,当它开始增长时,您遍历的每个新 link(队列中下一个最高优先级 link)将积累越来越大的相对于迄今为止遇到的其他所有事物的相对优先级。您几乎可以肯定,当队列达到上限时,其中优先级最高的项目将比当前页面(或您接下来可能访问的任何任意页面)上的前 N link 更重要。
请记住,如果您的优先级队列是支持数组的,则插入和删除操作将为 O(n)。排序的 linked 列表也将有 O(n) 的插入时间。二进制堆支持的优先级队列应该为大 n 提供最好的整体性能,在插入和删除时不比 O(log n) 差,并且 O (1) min/max 项查找。