Эффективная загрузка больших файлов с помощью R/RCurl

Я вижу, что многие примеры загрузки бинарных файлов с помощью RCurl похожи на такие:

library("RCurl")
curl = getCurlHandle()
bfile=getBinaryURL (
        "http://www.example.com/bfile.zip",
        curl= curl,
        progressfunction = function(down, up) {print(down)}, noprogress = FALSE
)
writeBin(bfile, "bfile.zip")
rm(curl, bfile)

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

В документации RCurl есть несколько примеров получения файлов по частям и управления ими по мере их загрузки, но, похоже, все они относятся к текстовым частям.

Можете ли вы привести рабочий пример?

ОБНОВИТЬ

Пользователь предлагает использовать собственный параметр R download file с параметром mode = 'wb' для двоичных файлов.

Во многих случаях нативная функция является жизнеспособной альтернативой, но есть ряд вариантов использования, где эта нативная функция не подходит (https, файлы cookie, формы и т. д.), и именно поэтому существует RCurl.


person antonio    schedule 20.01.2013    source источник
comment
download.file не считывается в оперативную память... можете ли вы предоставить пример файла для загрузки, с которым download.file не работает? :)   -  person Anthony Damico    schedule 20.01.2013


Ответы (2)


Это рабочий пример:

library(RCurl)
#
f = CFILE("bfile.zip", mode="wb")
curlPerform(url = "http://www.example.com/bfile.zip", writedata = f@ref)
close(f)

Он будет загружен прямо в файл. Возвращаемое значение будет (вместо скачанных данных) статусом запроса (0, если ошибок нет).

Упоминание CFILE немного кратко в руководстве по RCurl. Надеюсь, в будущем он будет включать больше деталей/примеров.

Для вашего удобства тот же код упакован в виде функции (и с индикатором выполнения):

bdown=function(url, file){
    library('RCurl')
    f = CFILE(file, mode="wb")
    a = curlPerform(url = url, writedata = f@ref, noprogress=FALSE)
    close(f)
    return(a)
}

## ...and now just give remote and local paths     
ret = bdown("http://www.example.com/bfile.zip", "path/to/bfile.zip")
person antonio    schedule 21.03.2013
comment
Есть ли причина, по которой это не будет работать при запуске R в BATCH? - person MikeTP; 28.10.2014
comment
Если вы используете это решение в пакете, вам, вероятно, потребуется изменить close(f) на RCurl::close(f), иначе вы можете столкнуться с ошибками, из-за которых он не может найти метод закрытия для CFILE. - person Dan Tenenbaum; 20.08.2015

гм.. используйте режим = 'wb' :) .. запустите это и следуйте моим комментариям.

# create a temporary file and a temporary directory on your local disk
tf <- tempfile()
td <- tempdir()

# run the download file function, download as binary..  save the result to the temporary file
download.file(
    "http://sourceforge.net/projects/peazip/files/4.8/peazip_portable-4.8.WINDOWS.zip/download",
    tf ,
    mode = 'wb' 
)

# unzip the files to the temporary directory
files <- unzip( tf , exdir = td )

# here are your files
files
person Anthony Damico    schedule 20.01.2013
comment
Это работает, спасибо. Я не проверял "wb", потому что с другими сайтами он работает без него. Например. download.file("http://www.nirsoft.net/utils/gdiview.zip", "gdiview.zip"), поэтому я приписал это методу перенаправления sf.net. Теперь, поскольку я использую EMACS ESS, мне нужно решить проблему с отображением индикатора выполнения, который не находится на консоли, как RCurl, а использует виджет GUI. - person antonio; 21.01.2013
comment
@antonio отметьте его как принятое, а также отредактируйте заголовок, поскольку ответ не включает RCurl: P - person Anthony Damico; 21.01.2013
comment
Хотя у вас хорошая альтернатива, я думаю, что изучение бинарных загрузок RCurl (R_curl_write_binary_data и т. д.) по-прежнему интересно. - person antonio; 22.01.2013
comment
это может быть интересно, но это не ответ на заданный вами вопрос;) - person Anthony Damico; 22.01.2013
comment
Я написал: «В документации RCurl есть несколько примеров получения файлов по фрагментам [...], но, похоже, все они ссылаются на текстовые фрагменты. Можете ли вы привести рабочий пример [для бинарных файлов]?” Вы просили меня привести пример с download.file, и я это сделал. Вы попросили меня перенести это на вопрос, и я сделал. Я еще раз благодарю вас за вашу подсказку, но я был и до сих пор интересуюсь RCurl. - person antonio; 22.01.2013