如何为R中的数据加载创建进度条?

Nix*_*xuz 23 load r file binary-data progress-bar

是否可以使用load()为加载到R中的数据创建进度条?

对于数据分析项目,大型矩阵从.RData文件加载到R中,这需要几分钟才能加载.我想有一个进度条来监控数据加载前的时间.R已集成了很好的进度条功能,但load()没有用于监视已读取数据量的挂钩.如果我不能直接使用负载,是否有间接方式可以创建这样的进度条?也许将.RData文件加载到chucks中并将它们放在一起用于R.是否有人对此有任何想法或建议?

Nix*_*xuz 12

我提出了以下解决方案,它适用于小于2 ^ 32 - 1字节的文件大小.

R对象需要序列化并保存到文件中,如下面的代码所示.

saveObj <- function(object, file.name){
    outfile <- file(file.name, "wb")
    serialize(object, outfile)
    close(outfile)
}
Run Code Online (Sandbox Code Playgroud)

然后我们以块的形式读取二进制数据,跟踪读取的数量并相应地更新进度条.

loadObj <- function(file.name){
    library(foreach)
    filesize <- file.info(file.name)$size
    chunksize <- ceiling(filesize / 100)
    pb <- txtProgressBar(min = 0, max = 100, style=3)
    infile <- file(file.name, "rb")
    data <- foreach(it = icount(100), .combine = c) %do% {
        setTxtProgressBar(pb, it)
        readBin(infile, "raw", chunksize)
    }
    close(infile)
    close(pb)
    return(unserialize(data))
}
Run Code Online (Sandbox Code Playgroud)

代码可以按如下方式运行:

> a <- 1:100000000
> saveObj(a, "temp.RData")
> b <- loadObj("temp.RData")
  |======================================================================| 100%
> all.equal(b, a)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

如果我们对进度条方法进行基准测试而不是在单个块中读取文件,我们会看到进度条方法稍慢,但不足以担心.

> system.time(unserialize(readBin(infile, "raw", file.info("temp.RData")$size)))
   user  system elapsed
  2.710   0.340   3.062
> system.time(b <- loadObj("temp.RData"))
  |======================================================================| 100%
   user  system elapsed
  3.750   0.400   4.154
Run Code Online (Sandbox Code Playgroud)

因此,虽然上述方法有效,但由于文件大小的限制,我觉得它完全没用.进度条仅适用于需要很长时间才能读入的大型文件.

如果有人能提出比这个解决方案更好的东西,那就太好了!