无法使用并行化使用foreach()调用rest api

时间:2016-08-01 11:44:11

标签: r rest parallel-processing remote-access

我正在从在线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,并且它立即运行(每次调用确实需要几秒钟)。

所以似乎跳过了调用。如果我不是并行运行相同的代码,它可以毫无问题地工作。

1 个答案:

答案 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秒。