Algorithm 需要使用优先级队列定制数据结构中的算法吗

Algorithm 需要使用优先级队列定制数据结构中的算法吗,algorithm,data-structures,priority-queue,Algorithm,Data Structures,Priority Queue,我正在开发一个使用优先级队列的web抓取算法。我有一个种子URL,我根据一个算法解析了它的所有链接。然后我根据算法得到的分数将所有解析的URL放入优先级队列中。该算法根据链接得分从优先级队列中选择新的种子URL。当选择链接作为种子URL时,它将从优先级队列中退出队列,以此类推。程序正在运行,没有任何问题。但问题是: 由于排队链路操作数越来越大,优先级队列的大小也越来越大。我怎样才能控制它?优先级队列的大小是否会影响我的爬虫程序的性能 当我试图获取每分钟爬网的URL数量时,我得到的结果很低。例如:

我正在开发一个使用优先级队列的web抓取算法。我有一个种子URL,我根据一个算法解析了它的所有链接。然后我根据算法得到的分数将所有解析的URL放入优先级队列中。该算法根据链接得分从优先级队列中选择新的种子URL。当选择链接作为种子URL时,它将从优先级队列中退出队列,以此类推。程序正在运行,没有任何问题。但问题是:

由于排队链路操作数越来越大,优先级队列的大小也越来越大。我怎样才能控制它?优先级队列的大小是否会影响我的爬虫程序的性能

当我试图获取每分钟爬网的URL数量时,我得到的结果很低。例如:运行程序1小时后,爬网页面的平均值比运行程序15分钟并获得爬网页面的平均值要低。发生这种情况是因为优先级队列大小吗?如何解决这个问题


我有这两个问题,需要你的帮助和你的想法来解决这个问题,在我的爬网算法

由于页面通常包含多个其他链接,优先级队列的大小将明显增大。这基本上是一个由页面和它们包含的其他URL引起的对整个图形的搜索,因此使用当前的算法,您将最终遍历整个图形。可能只找出每个页面的前N个链接,并只遵循这些链接


关于速度。访问网站是可以模仿的,所以你可以从这个开始,比如说,一次抓取k个链接。否则,您是否使用了优先级队列的良好实现?您是否正确关闭了程序打开的所有网络连接?

由于页面通常包含多个其他链接,优先级队列的大小显然会变大。这基本上是一个由页面和它们包含的其他URL引起的对整个图形的搜索,因此使用当前的算法,您将最终遍历整个图形。可能只找出每个页面的前N个链接,并只遵循这些链接


关于速度。访问网站是可以模仿的,所以你可以从这个开始,比如说,一次抓取k个链接。否则,您是否使用了优先级队列的良好实现?您是否正确关闭了程序打开的所有网络连接?

正如rafalio所指出的,您的队列大小将不断增加,因为平均一个网页包含多个出站链接,并且您不会在整个internet上实现关闭:-

但与rafalio建议的搜索每个页面前N个链接不同,我建议您设置优先级队列的全球最大上限,例如30000。这样,当它开始增长时,您遍历队列中下一个最高优先级链接的每个新链接都将积累到比迄今为止遇到的所有其他链接都更高的相对优先级。您几乎可以肯定,当队列到达cap时,队列中优先级最高的项目将比当前页面或下一个可以访问的任意页面上的前N个链接更重要


请记住,如果您的优先级队列是阵列备份的,则插入和删除操作将打开。排序后的链表在插入时间上也会发生变化。二进制堆支持的优先级队列应该为大n提供最佳的总体性能,在插入和删除方面不低于Olog n,在最小/最大项查找方面不低于O1。

正如rafalio所指出的,您的队列大小将不断增加,因为平均一个网页包含多个出站链接,并且您不会在整个internet上关闭:-

但与rafalio建议的搜索每个页面前N个链接不同,我建议您设置优先级队列的全球最大上限,例如30000。这样,当它开始增长时,您遍历队列中下一个最高优先级链接的每个新链接都将积累到比迄今为止遇到的所有其他链接都更高的相对优先级。您几乎可以肯定,当队列到达cap时,队列中优先级最高的项目将比当前页面或下一个可以访问的任意页面上的前N个链接更重要


请记住,如果您的优先级队列是阵列备份的,则插入和删除操作将打开。排序后的链表在插入时间上也会发生变化。二进制堆支持的优先级队列应该为大n提供最佳的总体性能,在插入和删除方面不低于Olog n,在最小/最大项查找方面不低于O1。

运行一小时后优先级队列有多大?如果它大到足以导致磁盘交换,那么这可能是您的问题。@ooga它超过4500
00张唱片。但我怎样才能克服这个问题呢?在一个优先级队列中获取450000个条目是非常合理的。如果您认为问题在队列中,那么下一步就是发布代码。但我建议您对代码进行分析,看看瓶颈到底在哪里。@user3386109。我认为问题在于排队和退队。我添加n个链接作为排队,同时我只在同一时间轮询1个链接。当爬网URL的数量开始减少时。我需要增加每分钟的抓取URL。运行一小时后,优先级队列有多大?如果它大到足以导致磁盘交换,那可能是你的问题。@ooga它有超过450000条记录。但我怎样才能克服这个问题呢?在一个优先级队列中获取450000个条目是非常合理的。如果您认为问题在队列中,那么下一步就是发布代码。但我建议您对代码进行分析,看看瓶颈到底在哪里。@user3386109。我认为问题在于排队和退队。我添加n个链接作为排队,同时我只在同一时间轮询1个链接。当爬网URL的数量开始减少时。我需要增加每分钟的抓取URL。所以你说队列的大小和遍历速度会影响我算法的速度?在解析了当前种子url的所有url后,我正在计算每个解析url的得分,然后将其放入优先级队列,这是否可能导致性能低下?对于你答案的第二部分,我不是在为访问做多线程编程。是的,当我启动程序时,我正在关闭连接。所以你说队列的大小和遍历会影响我算法的速度?在解析了当前种子url的所有url后,我正在计算每个解析url的得分,然后将其放入优先级队列,这是否可能导致性能低下?对于你答案的第二部分,我不是在为访问做多线程编程。是的,当我启动程序时,我正在关闭连接。