Я запрашиваю Freebase, чтобы получить информацию о жанрах для примерно 10000 фильмов.
После прочтения Как оптимизировать парсинг с помощью getURL() в R , я пробовал выполнять запросы параллельно. Однако у меня не получилось — см. ниже. Помимо распараллеливания, я также читал, что httr
может быть лучшей альтернативой RCurl
.
Мои вопросы: возможно ли ускорить вызовы API, используя а) параллельную версию цикла ниже (с использованием машины WINDOWS)? б) альтернативы getURL, такие как GET
в пакете httr
?
library(RCurl)
library(jsonlite)
library(foreach)
library(doSNOW)
df <- data.frame(film=c("Terminator", "Die Hard", "Philadelphia", "A Perfect World", "The Parade", "ParaNorman", "Passengers", "Pink Cadillac", "Pleasantville", "Police Academy", "The Polar Express", "Platoon"), genre=NA)
f_query_freebase <- function(film.title){
request <- paste0("https://www.googleapis.com/freebase/v1/search?",
"filter=", paste0("(all alias{full}:", "\"", film.title, "\"", " type:\"/film/film\")"),
"&indent=TRUE",
"&limit=1",
"&output=(/film/film/genre)")
temp <- getURL(URLencode(request), ssl.verifypeer = FALSE)
data <- fromJSON(temp, simplifyVector=FALSE)
genre <- paste(sapply(data$result[[1]]$output$`/film/film/genre`[[1]], function(x){as.character(x$name)}), collapse=" | ")
return(genre)
}
# Non-parallel version
# ----------------------------------
for (i in df$film){
df$genre[which(df$film==i)] <- f_query_freebase(i)
}
# Parallel version - Does not work
# ----------------------------------
# Set up parallel computing
cl<-makeCluster(2)
registerDoSNOW(cl)
foreach(i=df$film) %dopar% {
df$genre[which(df$film==i)] <- f_query_freebase(i)
}
stopCluster(cl)
# --> I get the following error: "Error in { : task 1 failed", further saying that it cannot find the function "getURL".
.packages=c("RCurl", "jsonlite")
в foreach, чтобы эти пакеты загружались рабочими процессами. - person Steve Weston   schedule 11.04.2014