最大限度地提高循环应用函数的速度

问题描述 投票:0回答:1

我现在正为一个庞大的数据集而颇为苦恼,我想做的不是很复杂,但事情太慢了。我想做的事情并不是很复杂,但问题是太慢了。第一步,我需要检查一个网站是否活跃。为了达到这个目的,我使用了下面的代码(这里有三个API-pathes的例子)。

library(httr)

Updated <- function(x){http_error(GET(x))}  
websites <- data.frame(c("https://api.crunchbase.com/v3.1/organizations/designpitara","www.twitter.com","www.sportschau.de"))
abc <- apply(websites,1,Updated)

我已经注意到for循环比apply函数快很多。然而,完整的代码(有大约1MIllion的API要检查)仍然需要55个小时来执行。任何帮助都将被感激:)

r performance loops apply
1个回答
1
投票

另外,类似这样的东西也可以用于将多个库传递到PSOCK集群。

clusterEvalQ(cl, {
     library(data.table)
     library(survival)
})

1
投票

最主要的限制因素可能是查询网站的时间. 目前,在执行下一个查询之前,你要等待每个查询返回一个结果。加快工作流程的最好方法是并行执行成批的查询。

如果你使用的是Unix系统,你可以尝试以下方法。

### Packages ###
library(parallel)

### On your example ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = 3))

### On a larger number of sites ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = detectCores())

### You can even go beyond your machine's core count ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = 40))

但是,你的处理器和网络连接的线程数 是取决于你的机器和你的连接。

另外,如果你卡在Windows系统上。

### For a larger number of sites ###
cl <- makeCluster(detectCores(), type = "PSOCK")
clusterExport(cl, varlist = "websites")
clusterEvalQ(cl = cl, library(httr))
abc <- parSapply(cl = cl, X = websites[[1]], FUN = Updated, USE.NAMES = FALSE)
stopCluster(cl)

在PSOCK集群的情况下, 我不确定超过机器的核心数是否有任何好处, 尽管我不是Windows的人, 我欢迎任何纠正.

© www.soinside.com 2019 - 2024. All rights reserved.