Максимальное увеличение скорости функции цикла / применения - PullRequest
0 голосов
/ 16 июня 2020

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

library(httr)

Updated <- function(x){http_error(GET(x))}  
websites <- data.frame(c("https://api.crunchbase.com/v3.1/organizations/designpitara","www.twitter.com","www.sportschau.de"))
abc <- apply(websites,1,Updated)

Я уже заметил, что a for l oop намного быстрее, чем функция apply. Однако выполнение полного кода (в котором нужно проверить около 1 миллиона API-интерфейсов) все равно займет около 55 часов. Любая помощь приветствуется :)

Ответы [ 2 ]

1 голос
/ 17 июня 2020

В качестве альтернативы, что-то вроде этого могло бы работать для передачи нескольких библиотек в кластер PSOCK:

clusterEvalQ(cl, {
     library(data.table)
     library(survival)
})
1 голос
/ 17 июня 2020

Основным ограничивающим фактором, вероятно, будет время, затраченное на запрос веб-сайта. В настоящее время вы ждете, пока каждый запрос вернет результат, прежде чем выполнять следующий. Лучший способ ускорить рабочий процесс - это выполнять пакеты запросов параллельно.

Если вы используете систему Unix, вы можете попробовать следующее:

### Packages ###
library(parallel)

### On your example ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = 3))

### On a larger number of sites ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = detectCores())

### You can even go beyond your machine's core count ###
abc <- unlist(mclapply(websites[[1]], Updated, mc.cores = 40))

Однако , точное количество потоков, которыми вы насыщаете свой процессор / соединение rnet, зависит от вашего компьютера и вашего соединения.

В качестве альтернативы, если вы застряли на Windows:

### For a larger number of sites ###
cl <- makeCluster(detectCores(), type = "PSOCK")
clusterExport(cl, varlist = "websites")
clusterEvalQ(cl = cl, library(httr))
abc <- parSapply(cl = cl, X = websites[[1]], FUN = Updated, USE.NAMES = FALSE)
stopCluster(cl)

В случае кластеров PSOCK я не уверен, есть ли какие-то преимущества от превышения количества ядер вашей машины, хотя я не человек Windows и приветствую любые исправления.

...