【问题标题】:How to best parallelize parsing of webpages?如何最好地并行解析网页?
【发布时间】:2011-12-05 16:23:23
【问题描述】:

我正在使用 html 敏捷包来解析论坛网站的各个页面。所以解析方法返回页面链接上的所有主题/线程链接,作为参数传递。我将所有已解析页面的所有这些主题链接收集在一个集合中。

之后,我检查它们是否在我的Dictionary 上已经查看过的 url,如果不是,那么我将它们添加到一个新列表中,UI 会显示这个列表,这基本上是新的主题/线程自上次创建。

既然所有这些操作看起来都是独立的,那么并行化这些操作的最佳方法是什么?

我应该使用 .NET 4.0 的 Parallel.For/ForEach 吗?

无论哪种方式,如何将每个页面的结果收集到一个集合中?还是没有必要?

每当解析方法完成时,我可以从我的集中式Dictionary 中读取它们是否同时存在吗?

如果我将这个程序运行 4000 页,大约需要 90 分钟,如果我可以使用所有 8 个内核在大约 10 分钟内完成相同的任务,那就太好了。

【问题讨论】:

    标签: c# .net multithreading parallel-processing


    【解决方案1】:

    Parallel.For/ForEach 结合ConcurrentDictionary<TKey, TValue> 在不同线程之间共享状态似乎是实现这一点的好方法。并发字典确保多线程的安全读/写。

    【讨论】:

    • 谢谢,您的意思是将解析页面中的所有链接存储在 ConcurrentDictionary 中,或者每次方法提取其链接时,它都会在我的集中集合中搜索新链接,这个集中集合应该是 ConcurrentDictionary?
    【解决方案2】:

    之后,我检查它们是否在我的已查看 url 词典中,如果不是,则将它们添加到新列表中,UI 会显示此列表,这基本上是自创建以来创建的新主题/线程上次。 由于所有这些操作看起来都是独立的,那么并行化这些操作的最佳方法是什么?

    您当然可以使用 Parallel.For/ForEach 来做到这一点,但您应该稍微考虑一下爬虫的设计。大多数爬虫倾向于使用多个线程进行爬取,每个线程都与一个页面获取客户端相关联,该客户端负责获取页面(在您的情况下,可能使用WebRequest/WebResponse)我建议阅读这些论文:

    如果你实现Mercator的设计,那么你应该很容易就能每秒下载50个页面,那么你的4000个页面将在80秒内被下载。

    无论哪种方式,如何将每个页面的结果收集到一个集合中?

    您可以将结果存储在 ConcurrentDictionary<TKey, TValue> 中,就像 Darin 提到的那样。您不需要在值中存储任何内容,因为您的键是链接/URL,但是如果您正在执行URL-seen Test,那么您可以将每个链接/URL 散列为一个整数,然后将散列存储为键和链接/URL 作为值。

    或者这没有必要?

    什么是必要的完全由您决定,但如果您正在执行 URL-seen 测试,那么它是必要的。

    我可以在解析方法完成时从我的集中式字典中同时读取它们以查看它们是否存在吗?

    是的,ConcurrentDictionary 允许多个线程同时读取,所以应该没问题。如果您只想查看链接是否已被抓取,它将正常工作。

    如果我将这个程序运行 4000 页,大约需要 90 分钟,如果我可以使用所有 8 个内核在大约 10 分钟内完成相同的任务,那就太好了。

    如果你的爬虫设计得足够好,你应该能够在普通台式电脑上大约 57 秒内下载和解析(提取所有链接)4000 个页面......我用标准 C# 大致得到了这些结果@ 987654330@ 在具有 10 Mbps 连接的 4GB、i5 3.2 GHz PC 上。

    【讨论】:

    • 谢谢,墨卡托设计对我来说可能实现起来有点复杂,但我会将所有提取的链接收集到 ConcurrentDictionary 中,然后在完成后通过检查来收集新链接我也想创建一个ConcurrentDictionary 的集中集合,所以我也可以并行执行此步骤。这是我能想到的最好的了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多