优化新闻提取

时间:2013-10-28 16:55:23

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

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

  • 从xml文件加载报纸信息。
  • 转到指定的部分并获取新闻项的网址。
  • 转到每个网址并获取标题,图片,发布商。
  • 使用Windows Phone的MVVM架构进行显示。

整个事情是异步发生的...意味着一旦获取报纸的一部分网址,它就会被添加到队列中,第二阶段包括获取标题,图像等等...即使对于一篇文章,也会显示此内容。稍后,随着更多文章被提取,它们将被添加到列表中。

为了获取目的,我使用SmartThreadPool(http://www.codeproject.com/Articles/7933/Smart-Thread-Pool)用于Windows Phone。

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

注意:我有一个两阶段的方法,因为很多时候图像都没有头条新闻,只能在文章中找到。

2 个答案:

答案 0 :(得分:2)

制作80个网络请求并获得80个响应需要花费一分多钟时间并不奇怪。即使在有线连接上,请求和响应之间通常至少需要500毫秒。根据服务器和连接的不同,请求和响应之间的整秒延迟并非不合理。这并不计算下载内容所需的时间。

你的3 Mbps链路是每秒三兆*位*,或者每秒小于400千字节的东西,并且将与使用相同塔或连接点的其他人共享。

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

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

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

当然,所有这些都是猜测,因为您没有显示任何代码或提供了详细描述的方式。但是,如果我要写一个像你描述的新闻报道,这就是我采取的方法。

答案 1 :(得分:0)

(对于这样的问题,https://softwareengineering.stackexchange.com/不是更好的家吗?)

需要考虑的事项:

图像需要时间加载,即使在3G或4G手机上,也可以跳过或推迟加载!

看一下NextGen reader在WP8上的表现(也适用于Win8):

  • 它取出文章摘录并几乎立即显示
  • 当您点击某篇文章时,它会将其全部加载(带图片)
  • 如果图片加载时很长,则不会显示,请注意,某些网站需要特定的推荐人,无论是出于安全原因还是仅通过其网站访问其链接
  • 即。 :图片在其大小/连接速度旁边没有加载的原因很多
  • 仍然在阅读器上,当您点击文章标题时,它会打开IE中的链接,我的意思是这样做不再是您的问题,因为人们在冲浪而不使用您的应用程序

在我看来,你应该让你的应用程序工作得足够快,但它不一定非常完美(特别是图像部分),随着时间的推移,人们很快就会明白,如果缺少图像但这些网站并不是你的应用程序的错(顺便说一句,这是真的)。​​

您可以查看桌面应用。与Fiddly一起看看它到底发生了什么。

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


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

我需要从许多不同的来源加载许多图像,它必须很快。最阻塞的问题是超时,因为他们很长/很烦人等待。我最终跳过了缓慢的图像加载,我很高兴,虽然其中一些不可见:

enter image description here

还有一些图片不可用,但在感知上它并不像内容在这里那么重要:文本和原始网站的链接。你总是可以尝试在后台再次加载。

我发布的代码足以满足我的需求,如果图片需要超过3秒,那么我就跳过它。我可以稍后再尝试加载它,但我的应用程序中最重要的部分是:响应性。除此之外,我还并行下载了一些内容,我邀请您查看下面发布的答案:

Asynchronously and parallelly downloading files

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