file - 如何在 R 中创建数据加载进度条?

标签 file r load progress-bar binary-data

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

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

最佳答案

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

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

saveObj <- function(object, file.name){
    outfile <- file(file.name, "wb")
    serialize(object, outfile)
    close(outfile)
}

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

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))
}

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

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

如果我们对以单个 block 读取文件的进度条方法进行基准测试,我们会发现进度条方法稍微慢一些,但还不足以担心。

> 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

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

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

关于file - 如何在 R 中创建数据加载进度条?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6165077/

相关文章:

r - 没有数据时如何避免geom_line或geom_path中的连接线?

r - 基于二进制向量选择矩阵的列

c# - 如何在 Dot Net Compact Framework 中预加载类库?

javascript - 使用 .load 传递 $_GET 变量并加载特定页面片段

C编程,读取文件错误?

c - 处理错误的文件输入名称。当从 argv 中读取名称错误的 i 文件时,程序崩溃。 C语言编程

image - 在 Gradle 中使用 Spock 测试创建的文件

regex - 正则表达式在某个字符 R Perl 之前抓取单词

python - 奇怪的 undefined variable python3

java - 使用 JAR 中的文件,同时从 jar 运行应用程序