r语言 - 最大化循环/应用函数的速度



我现在正在为庞大的数据集而苦苦挣扎。 我想做的不是很复杂,但问题是它太慢了。第一步,我需要检查网站是否处于活动状态。为此,我使用了以下代码(此处包含三个 API 路径的示例(

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 函数快得多。但是,完整的代码(需要检查大约 100 万个 API(仍然需要大约 55 小时才能执行。任何帮助都值得赞赏:)

或者,像这样的东西可以用于将多个库传递给 PSOCK 集群:

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

主要限制因素可能是查询网站所花费的时间。目前,在执行下一个查询之前,您正在等待每个查询返回结果。加快工作流的最佳方法是并行执行批量查询。

如果您使用的是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人,我欢迎任何更正。

最新更新