【问题标题】:getURL working slowgetURL 工作缓慢
【发布时间】:2017-02-25 22:13:05
【问题描述】:

我正在从各种数据库中提取信息,并为此跟踪如何在每个数据库的不同 ID 之间进行转换。

library("RCurl")
library("XML")
transformDrugId<-function(x){
URLtoan<-getURL(x)
PARSED<-htmlParse(URLtoan)
dsource<-xpathSApply( PARSED,"//*[@id='advancedform']/div[7]/fieldset/p/b[1]/text()",xmlValue)
id<-xpathSApply( PARSED,"//*[@id='advancedform']/div[7]/fieldset/p/a[1]/span/text()",xmlValue)
return(c(dsource,id))}  

作为一个例子,在我的电脑上使用 linux 和 RSTUDIO 所花费的时间是

system.time(DBidstest<-sapply(urls[c(10001:10003)],transformDrugId))
 user  system elapsed 
0.132   0.000   3.675 

system.time(DBids7<-sapply(urls[c(601:700)],transformDrugId))
user  system elapsed 
3.980   0.124 549.233 

其中 urls 包含我检查 ID 的 TDR 数据库的 url 地址列表 当我必须为 300000 个药物 ID 执行此操作时,计算时间变得非常长。 例如,我提供前五个网址

head(urls)
[1] "http://tdrtargets.org/drugs/view?mol_id=608858"
[2] "http://tdrtargets.org/drugs/view?mol_id=608730"
[3] "http://tdrtargets.org/drugs/view?mol_id=549548"
[4] "http://tdrtargets.org/drugs/view?mol_id=581648"
[5] "http://tdrtargets.org/drugs/view?mol_id=5857"  
[6] "http://tdrtargets.org/drugs/view?mol_id=550626"

我们将不胜感激任何可能有助于减少获取和分析 html 的时间的帮助。我愿意接受任何可能涉及不使用 R 的建议。

我后来意识到,对 10 个或更少的 URL 使用 getURLAsynchronous 有时会更快,但使用两次会变慢

system.time(test<-getURLAsynchronous(urls[c(1:10)]))
user  system elapsed 
0.128   0.016   1.414 
system.time(test<-getURLAsynchronous(urls[c(1:10)]))
user  system elapsed 
0.152   0.088 300.103

【问题讨论】:

  • 虽然不是最快的,但我想知道“计算时间”是否与潜在的网络延迟一样不是您的问题。当我看到网络操作花费 >500 秒的运行时间和 explanation of the time fields。)
  • 每个网页下载的权重为50kb,我也尝试过使用getURL异步但时间似乎没有改善。如何检查是否是延迟问题并解决?
  • 如果使用download.file,时间是否相同?
  • 当我使用 download.file 时间降低 1/3 system.time(download.file(urls[c(1:3)],c("test1","test2","test3 ")) ) 用户系统已过 0.024 0.000 1.013
  • 所以听起来download.filegetURL 更快(在这种情况下),也许您可​​以使用前者下载它,然后对下载的文件进行xml-parse。下载时间是否因一天中的时间而异?过去我注意到RCurlhttr(使用curl,与libcurl 类似但明显不同的接口)之间的一些性能差异,虽然我现在无法量化它,但我建议你考虑尝试httr

标签: r xml linux web-scraping rcurl


【解决方案1】:

直接使用 shell 下载速度快十倍 回声 $URLTEST| xargs -n 1 -P 7 wget -q 其中 URLTEST 是要下载的 html 列表。-n 设置查询之间的等待时间,-P 设置并行查询的数量,两者都经过微调,以便我得到 100 个 html 真正的 0m13.498s 用户 0m0.196s 系统 0m0.652s

R 的接口 t libcurl 的方式一定有问题,这使得 getURL() 和 downloadFile() 比较起来真的很慢

【讨论】:

    猜你喜欢
    • 2013-10-01
    • 2018-11-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-25
    • 1970-01-01
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    相关资源
    最近更新 更多