Мне нужно написать скрипт R, который в конце посылает огромное количество запросов на получение на сервер. Каждая строка моего фрейма данных содержит несколько сведений. В последнем столбце «url» создаются запросы http в каждой строке, например: https://logsxxx.xxx.com/xx.xx?.....
Может случиться так, что я должен отправить 300.000 - 1.000.000 запросов на получение сценария.
Хорошо, что мой скрипт работает и запросы доходят до сервера.
Плохо то, что цикл стоит много времени, пока все строки не будут отправлены. Для 300 000 строк требуется около 9 часов.
Я проверял, возможно ли это с помощью ifelse или apply, но у меня не получилось ...
system.time(
for (i in 1:300000){
try(
{
GET(mydata$url[i], timeout(3600))
print(paste("row",i,"sent at",Sys.time()))
}
, silent=FALSE)
}
)
Еще одна плохая вещь - скрипт может не отправлять 100%, если по какой-либо причине разрывается интернет-соединение. Тогда я вижу следующую ошибку:
[1] "row 18 sent at 2019-01-18 14:22:05"
[1] "row 19 sent at 2019-01-18 14:22:06"
[1] "row 20 sent at 2019-01-18 14:22:06"
[1] "row 21 sent at 2019-01-18 14:22:06"
Error in curl::curl_fetch_memory(url, handle = handle) :
Timeout was reached: Connection timed out after 10000 milliseconds
[1] "row 23 sent at 2019-01-18 14:22:16"
[1] "row 24 sent at 2019-01-18 14:22:16"
[1] "row 25 sent at 2019-01-18 14:22:16"
По крайней мере, скрипт не ломается полностью и переходит к следующему ряду. Проблема здесь в том, что чем дольше происходит сбой подключения к Интернету, тем больше строк не будет отправлено.
Буду очень признателен, если:
- кто-то может показать мне более быстрый способ отправки запросов - возможно, без вложенного цикла for
- и покажите мне, как я могу сделать что-то подобное с кодом: «если запрос get не выполняется из-за подключения к Интернету, повторите попытку 3 раза, прежде чем переходить к следующему запросу get. Делайте это, пока все элементы i не будут отправлены»
С уважением,