Crawler url队列还是哈希列表?

时间:2011-07-28 13:00:04

标签: delphi hash queue web-crawler

我正在重写我之前写过的Delphi 6站点映射器应用程序的spidering / crawler部分。该应用程序蜘蛛网站。

我需要管理两个方面:

  1. 要扫描的网址队列,先进先出。
  2. 扫描的网址列表,以便新网页中的链接如果已经访问过,则不会添加到队列中。需要搜索此列表。
  3. 以前这些分别是用TList和StringList完成的。显然,这些网站的性能在具有数千个链接的网站上降级。

    我的问题是,应该为这些队列/列表使用什么来确保最佳性能?我对哈希的经验很少。

2 个答案:

答案 0 :(得分:5)

恕我直言的哈希将是此类名单的最佳候选人。

在Delphi 6中,您可以使用THashedStringList单元中提供的IniFiles类。它会比TStringList更快。

请注意,如果您使用已排序的TStringList,则可以使用更快的二进制搜索,速度足够快。

对于更完整的内容,您可以查看这些OpenSource库:

  • TSynBigTableMetaData用于存储与元数据字段关联的任何数量数据(在您的情况下为HTML页面) - 您有元数据字段的索引,因此添加和检索将很快;
  • 使用散列名称的动态数组可以在带有TDynArrayHashed的Delphi 6中使用。

更新

如果使用排序的TStringList,只是排序URI的技巧:您可以更好地使用向后排序函数,即比较从字符串末尾开始而不是从开头开始的URI文本,因为在URI中,更改是在后缀而不是在前缀中。您可以更快地进行排序/二进制搜索。

答案 1 :(得分:3)

Trie的工作非常适合存储大型(唯一)文本块并保留高速搜索。不久前,我为Pascal Gamer写了一篇关于他们的快速而又脏的文章: http://www.pascalgamer.com/issue_details.php?i=1可能值得一读。

基本概念是创建一个包含字母或符号及其所有链接字母和符号作为子项的记录(类,等等)。这些子项存储已排序,因此可以使用快速二进制搜索来查找下一个节点。当您到达输入结尾时,您可以判断您的单词是否结束或有效位置。

关于Trie的好处,你可以毫无问题地进行部分匹配,反向查找,跳过搜索等。下方是;您不能轻易拥有重复的条目,它们在SMALLER数据集上占用更多空间,并且根据您的实现情况,敏感的切换可能是“有趣的”。

在数百万条记录中日复一日地使用概念,没有任何问题和高速保留。