0

我有一个爬虫机器人,它使用parallel.for 和parallel.foreach 并行下载各种页面。MaxDegreeOfParallelism 设置为 20 左右,因为增加它似乎不会进一步提高性能,我不想让任何 Web 服务器过载。

当我从 ASP.NET 网站(所有地方)开始爬网时,它以可接受的性能运行,这一切都需要几个小时。由于此设置的设计问题,我正在更改此设置,以便可以从控制台启动它。

我需要的所有代码都在一个 dll 中,网站和控制台应用程序都可以访问它。

除了启动消息外,控制台没有输出。

问题是当我从控制台(或从调试器)运行它时,它比从 ASP.NET 网站运行它花费的时间大约长 10 倍(!)。如果 ASP.NET 版本比控制台慢,我会更容易理解。

为什么会这样,或者我该如何调试或找出原因或解决问题?

编辑: 通过 Visual Studio 调试器尝试两种变体时也会发生这种情况。从“调试”到“输出”窗口的输出类似于:

线程 '' (0x1d34) 以代码 0 (0x0) 退出。线程 '' (0xf20) 以代码 0 (0x0) 退出。线程 '' (0x3414) 以代码 0 (0x0) 退出。线程 '' (0x35c8) 以代码 0 (0x0) 退出。线程 '' (0xdc) 以代码 0 (0x0) 退出。线程 '' (0x1c98) 以代码 0 (0x0) 退出。线程 '' (0x3308) 以代码 0 (0x0) 退出。线程 '' (0x2b00) 以代码 0 (0x0) 退出。线程 '' (0x2f7c) 以代码 0 (0x0) 退出。线程 '' (0x345c) 以代码 0 (0x0) 退出。线程 '' (0x2a18) 以代码 0 (0x0) 退出。线程 '' (0x138) 以代码 0 (0x0) 退出。线程 '' (0x3650) 以代码 0 (0x0) 退出。线程 '' (0x376c) 以代码 0 (0x0) 退出。

除了在 ASP.NET 情况下,此文本的编写速度大约快 10 倍。

也许还值得一提的是,该 dll 通过 COM 为每个下载的页面调用 7zip 来压缩它。

4

1 回答 1

2

如果您从同一台服务器下载大量页面,您将遇到ServicePointManager.DefaultConnectionLimit. 默认值通常是 2(如 HTTP 1.1 RFC 建议的那样),但对于 ASP.NET 应用程序来说似乎是 10。如果您看到不同的数字,则可能是某些东西更改了默认值。

当您达到此限制时,框架将不再与该特定服务器(或“端点”)建立任何连接,因此您的大多数线程将阻止不做任何事情。

您可以通过更改 的值来解决此问题DefaultConnectionLimit,但更好的解决方案可能是更改请求的顺序,这样您就不会同时向同一服务器发出许多请求。

于 2013-03-17T16:14:24.557 回答