2016-08-01 4 views
0

Я загружаю данные из онлайн-API. Данные разбиты на страницы, поэтому мне нужно совершать последовательные звонки.Невозможно вызвать rest api с foreach(), используя распараллеливание

Поэтому я настроил параллельный цикл 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 
    } 

конечная точка URL-адрес REST.

Цикл возвращает NULL, и, кроме того, он запускается немедленно (каждый вызов действительно должен за пару секунд).

Так что кажется, что вызовы пропускаются. Если я запускаю один и тот же код не параллельно, он работает без проблем.

+0

Вы должны включить свой код, который устанавливает параллельный бэкэнд перед вышеуказанным блоком кода, а также все остальное, необходимое для воспроизведения этого примера ('endpoint',' page' и т. Д.). – nrussell

+0

страница уже определена в коде. Я добавил использованные библиотеки. Конечная точка, как я уже сказал, является URL-адресом для отдыха (который я не могу раскрывать), но любой другой URL-адрес мог бы сделать; поскольку я сказал, что код работает не параллельно (% do% вместо% dopar%), работает отлично, поэтому конечная точка не является проблемой. – 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. Это может означать, что вам приходится замедлять ваш скрипт - например, на каждую четвертую страницу ждать 1 сек.

+0

Какая часть это заставляет работать? – Bakaburg

 Смежные вопросы

  • Нет связанных вопросов^_^