我正在从在线API加载数据。数据是分页的,所以我需要连续调用。
因此我设置了一个并行的foreach()循环,最终rbind()输出。
以下是代码:
library('foreach')
library('parallel')
library('jsonlite')
registerDoMC(cores = parallel::detectCores())
data <- foreach(page = 1:10, .combine = rbind) %dopar% {
raw.data <- fromJSON(paste(endpoint, '&page=', page, sep =''))
raw.data <- raw.data$results
data.piece <- raw.data[c('id', 'scraper', 'title', 'text', 'ts', 'url', 'pertinence', 'source')]
data.piece
}
端点是一个REST网址。
循环返回NULL,并且它立即运行(每次调用确实需要几秒钟)。
所以似乎跳过了调用。如果我不是并行运行相同的代码,它可以毫无问题地工作。
答案 0 :(得分:1)
我碰到了类似的情况,并根据你的情况调整我的代码产生以下结果:
library(jsonlite)
library(dplyr)
library(foreach)
library(doParallel)
fetch.data <- function(page) {
# confirm the url you are fetching data from ...
url = 'http://api.paginated/?page='
endpoint = paste0(url, page)
print(paste0('fetching data for => ', endpoint))
raw.data <- fromJSON(endpoint, flatten = TRUE)
raw.data
}
no_cores <- detectCores()
cluster <- makeCluster(no_cores)
registerDoParallel(cluster)
t.start <- Sys.time()
data <- foreach(page=1:10, .combine=bind_rows, .packages=c('jsonlite')) %dopar% {
if (page %% 4 == 0) Sys.sleep(1)
page_data <- fetch.data(page)
page_data <- page_data$results
data.piece <- page_data[c('id', 'scraper', 'title', 'text', 'ts', 'url', 'pertinence', 'source')]
data.piece
}
t.end <- Sys.time()
stopImplicitCluster()
print(t.end - t.start)
这段代码最近对我有用。你唯一需要注意的是你在api的限制范围内玩。这可能意味着您必须放慢脚本速度 - 例如,每隔4页等待1秒。