Почему требуется больше времени для data.table :: fread для чтения файла, когда имя файла указано иначе?

Я читаю файл в R, используя fread, используя следующие методы:

fread("file:///C:/Users/Desktop/ads.csv")  
fread("C:/Users/Desktop/ads.csv")       # Just omitted "file:///"  

Я заметил, что время выполнения очень отличается:

microbenchmark(  
fread("file:///C:/Users/Desktop/ads.csv"),  
fread("C:/Users/Desktop/ads.csv")
)

Unit: microseconds
                          expr               min        lq      mean     median       uq       max    neval cld
fread("file:///C:/Users/Desktop/ads.csv") 5755.975 6027.4735 6696.7807 6235.3365 6506.652 41257.476   100   b  
fread("C:/Users/Desktop/ads.csv")          525.492  584.0215  673.7166  647.4745  727.703  1476.191   100   a   

Почему время во время работы сильно меняется? Не существует заметной разницы между 2 вариантами, когда я использовал read.csv(), хотя

Ответы

Ответ 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 секунд).