2016-08-01 4 views
0

オンラインAPIからデータをロードしています。データにはページが付けられているため、連続して呼び出しを行う必要があります。並列化を使用してforeach()で残りのAPIを呼び出せません

したがって、出力を最終的にrbind()する並列化されたforeach()ループを設定しました。ここで

はコードです:

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 URLです。

ループはNULLを返し、さらにすぐに実行されます(各呼び出しには数秒が必要です)。

したがって、呼び出しがスキップされたようです。同じコードを並列に実行しないと、問題なく動作します。

+0

上記のコードブロックの前に並列バックエンドを設定するコードだけでなく、この例を再現可能にするために必要なすべてのもの( 'endpoint'、' page'など)を含める必要があります。 – nrussell

+0

ページが既にコードで定義されています。私は使用されたライブラリを追加しました。 私が言ったエンドポイントは、残りのURL(これは私が開示することはできません)ですが、残りのURLは可能です。 (%dopar%の代わりに%do%)というコードは、完璧に動作するので、エンドポイントは問題ではありません。 – Bakaburg

+0

URLがあれば、エラーを再現するすべてのURLを例にしてください。 – nrussell

答えて

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秒間待機します。

+0

それは動作させる部分はどれですか? – Bakaburg

関連する問題