【问题标题】:Optimising news fetching [closed]优化新闻获取[关闭]
【发布时间】:2013-10-28 16:55:23
【问题描述】:

我有一个网络抓取工具,用于从 wp7 中抓取不同来源的新闻。 我目前这样做的方法是:

  • 从 xml 文件加载报纸信息。
  • 转到指定版块并获取新闻项目的网址。
  • 转到每个网址并获取标题、图片、发布者。
  • 使用 windows phone 的 MVVM 架构显示。

整个过程是异步进行的...这意味着一旦从报纸的某个部分获取 url,它就会被添加到队列中,第二阶段包括获取标题、图像等开始...并且尽快即使是一篇文章也会获取它,它会显示出来。稍后随着更多文章被提取,它们被添加到列表中。

出于获取目的,我在 windows phone 上使用了 SmartThreadPool(http://www.codeproject.com/Articles/7933/Smart-Thread-Pool)。

我的问题是......即使从 9 个出版物中获取大约 80 个项目(总共),也需要一分钟多的时间。 我怎样才能加快这个过程?

注意:我有一个两阶段的方法,因为很多时候图片没有标题,只能在文章中找到。

【问题讨论】:

  • 您的 Profiler 对此有何看法?
  • 也许这就是您手机的网络连接查询所有数据所需的时间。
  • @Servy 我的连接很合理...已经达到 3G 速度(大约 3 MBPS)。我如何以这些速度加快速度?

标签: c# multithreading windows-phone-7 optimization web-scraping


【解决方案1】:

发出 80 个 Web 请求并获得 80 个响应需要一分钟多的时间,这并不奇怪。即使在有线连接上,请求和响应之间通常至少需要 500 毫秒。根据服务器和您的连接,请求和响应之间的一整秒延迟并非不合理。这还不包括下载内容所需的时间。

您的 3 Mbps 链接是每秒 3 兆位*,或者每秒小于 400 KB,这将与使用同一塔或连接点的其他所有人共享。

我对 SmartThreadPool 不熟悉,也不知道您是如何使用它的。但是,它可能会限制并发线程的数量,并且您每个请求使用一个线程。因此,如果它将您限制为 4 个并发线程,那么您可以做的最好的可能是每秒 4 次下载。

如果您使用单个线程发出多个异步 Web 请求,则可以有 15 个(可能更多)并发请求。由于发出 Web 请求所花费的大部分时间都花在等待服务器的响应上,因此与其他方法相比,这将大大提高性能。假设您正在下载的新闻文章没有太大以至于限制因素是带宽。

根据您的描述,我想说您不需要执行任何 显式 多线程。只需使用异步 Web 请求即可。

当然,所有这些都是猜测,因为您没有显示任何代码或提供太多详细描述。但如果我要像你描述的那样写一个新闻抓取工具,我会采取这种方法。

【讨论】:

    【解决方案2】:

    https://softwareengineering.stackexchange.com/ 不是更好地回答此类问题吗?)

    需要考虑的事项:

    加载图片需要时间,即使在 3G 或 4G 手机上也是如此,跳过或推迟加载!

    看看NextGen reader在WP8上是如何做到的(Win8也有):

    • 它提取文章的摘录并几乎立即显示它们
    • 当您点击一篇文章时,它会加载整个文章(带图片)
    • 如果图片加载时间过长,则不会显示,请注意,有些网站需要特定的引荐来源网址,无论是出于安全原因还是仅通过其网站才能访问其链接
    • 即: 除了大小/连接速度之外,图片无法加载的原因有很多
    • 仍然在阅读器上,当您点击文章标题时,它会在 IE 中打开链接,我的意思是这样做不再是您的问题,因为人们正在上网而不使用您的应用程序

    在我看来,您应该让您的应用程序运行得足够快,但它不必完美(尤其是图像部分),随着时间的推移,人们会很快明白,如果图像丢失不是您的应用程序的错,而是那些网站的错(顺便说一句,这是真的)。​​

    您可以查看桌面应用程序。用Fiddly看看它到底做了什么。

    几个月来,我每天都在我的 WP8 上使用这个阅读器,我对这种行为感到满意,我知道对于丢失的图像(更准确地说,在某些网站上),我要么必须浏览网站本身,要么就忘记关于它,我不会为此责怪应用程序。


    现在我遇到了类似的问题,问了一个问题,最后我自己回答了:

    我需要从许多不同的来源加载许多图像,它必须很快。最阻碍的问题是超时,因为它们等待的时间很长/很烦人。我最终跳过了缓慢图像的加载,尽管其中一些不可见,但我对此感到非常高兴:

    还有一些图片不可用,但从感觉上看,它并不像这里的内容那么重要:文本和指向原始网站的链接。您可以随时尝试在后台再次加载。

    我发布的代码足以满足我的需求,如果一张图片超过 3 秒,我就跳过它。我可以稍后再尝试加载它,但我的应用程序最重要的部分在这里:responsiveness。除此之外,我同时下载了一些东西,我邀请你看看我在下面发布的答案:

    Asynchronously and parallelly downloading files

    需要考虑的额外事项:缓存图像

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多