Ответ 1
Обновить:
В ?fread
добавлено следующее:
Когда
input
начинается с http://, https://, ftp://, ftps://или file://,fread
обнаруживает это и загружает цель во временный файл (вtempfile()
), прежде чем приступать к прочитайте файл как обычно. Безопасные URL-адреса (ftps://и https://) загружаются с помощьюcurl::curl_download
; Пути ftp://и http://загружаются с помощьюdownload.file
иmethod
установленного вgetOption("download.file.method")
, поgetOption("download.file.method")
"auto"
; и файл://загружается с помощьюdownload.file
сmethod="internal"
. NB: это означает, что для файла://даже файлы, найденные на текущем компьютере, будут "загружены" (т.е. Скопированы) во временный файл. Подробнее см.?download.file
.
Из источника fread
:
if (str6 == "ftp://" || str7 == "http://" || str7 == "file://") {
method = if (str7 == "file://") "auto"
else getOption("download.file.method", default = "auto")
download.file(input, tmpFile, method = method, mode = "wb", quiet = !showProgress)
}
То есть ваш файл загружается во временный файл, который должен состоять из глубокого копирования содержимого файла во временное место. file://
в действительности не предназначен для использования в локальных файлах, но файлы в сети, которые должны быть загружены локально перед считыванием (IIUC; FWIW, это то, что fread
тестового режима использует для имитации загрузки файла во время тестирования на CRAN, где внешняя загрузка файла невозможна).
Я также замечаю, что ваши тайминги имеют порядок микросекунд, что может объяснить несоответствие по сравнению с read.csv
. Представьте, что read.csv
занимает 1 секунду, чтобы прочитать файл, а fread
0,01 секунды; копирование файлов занимает .05
секунд. Тогда в обоих случаях read.csv
будет выглядеть примерно одинаково (1 против 1,05 секунды), в то время как fread
выглядит существенно медленнее для file://
case (.01 vs..06 секунд).