【问题标题】:Why does it take more time for data.table::fread to read a file when filename is specified differently?当文件名指定不同时,为什么 data.table::fread 读取文件需要更多时间?
【发布时间】:2018-08-27 16:47:13
【问题描述】:

我正在使用以下方法使用 fread 将文件读入 R:

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   

为什么运行时间变化如此之大?但是,当我使用 read.csv() 时,两种变体之间没有明显差异

【问题讨论】:

  • 我想知道如何在真实数据集上进行扩展。以微秒为单位进行测量通常是没有意义的。
  • @DavidArenburg 我正在运行一个带有 16,592,802 行数据集的基准 atm。
  • @DavidArenburg gist.github.com/JarkoDubbeldam/78fdd854fbb0cdb8b7e1893dc70da4ea 683MB 的较大文件,相差约一秒(相差 5%)
  • 查看新的小插图以获取有关 data.table 正确基准测试的建议,其内部优化使得使用 microbenchmark 之类的东西本身就充满了问题,例如缓存
  • @MichaelChirico 是的,我注意到缓存在这里弄乱了结果。第一次运行的时间是后续运行的 3 倍。

标签: r data.table


【解决方案1】:

更新:

以下内容已添加到?fread

input 以 http://、https://、ftp://、ftps:// 或 file:// 开头时,fread 会检测到这一点并下载在继续像往常一样读取文件之前,将目标定位到一个临时文件(tempfile())。使用curl::curl_download 下载安全 URL(ftps:// 和 https://); ftp://和http://路径下载,download.filemethod设置为getOption("download.file.method"),默认为"auto";并且 file:// 使用download.filemethod="internal" 下载。注意:这意味着对于 file://,即使在当前机器上找到的文件也会被“下载”(即硬拷贝)到临时文件中。详情请见?download.file


来自source of 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:// 并不是真正用于 local 文件,而是用于网络中需要在本地下载才能读取的文件(IIUC;FWIW,这就是 fread 的测试机制用于在 CRAN 上进行测试时模拟文件下载,无法进行外部文件下载)。

我还注意到您的时间大约是 微秒,这可以解释与 read.csv 的差异。想象一下read.csv 读取文件需要 1 秒,而fread 需要 0.01 秒;文件复制需要.05 秒。那么在这两种情况下,read.csv 看起来都差不多(1 秒对 1.05 秒),而freadfile:// 情况下看起来要慢得多(0.01 秒对 0.06 秒)。

【讨论】:

  • 实际上,这些数字是缓存正在进行的有力指标:第一个基准测试读取文件(缓存它),存储一个副本(可能在后面写),然后读取副本(从缓存);第二个基准测试只是从缓存中读取文件。不同之处在于第一个基准测试的延迟路径中的磁盘访问(大约 5 毫秒)。
  • @cmaster 哦,这提醒了我,这是一个很好的机会来突出微基准测试中的热门小插曲data.table Jan Gorecki:github.com/Rdatatable/data.table/pull/2684 反馈欢迎,它还在测试版!
  • @MichaelChirico:你对file:///前缀有什么参考吗?我一直想知道它的意义是什么,以及为什么有些 R 函数可以处理它,而另一些则不能。 (有关示例,请参阅here
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2012-10-27
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 2020-05-05
相关资源
最近更新 更多