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

File 如何为R中的数据加载创建进度条?,file,r,load,progress-bar,binary-data,File,R,Load,Progress Bar,Binary Data,是否可以使用为加载到R中的数据创建进度条 对于数据分析项目,从.RData文件在R中加载大型矩阵,这需要几分钟的加载时间。我想有一个进度条来监控数据加载前的时间。R已经集成了很好的功能,但是load()没有用于监视读取了多少数据的挂钩。如果我不能直接使用load,有没有一种间接的方法可以创建这样的进度条?也许将.RData文件加载到chucks中,并将它们放在一起用于R。有人对此有什么想法或建议吗 我提出了以下解决方案,它适用于小于2^32-1字节的文件大小 需要序列化R对象并将其保存到文件中,

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


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

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

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

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

saveObj我是否可以建议加快加载(和保存)时间,这样就不需要进度条了?如果读取一个矩阵是“快速”的,那么您可以潜在地报告每个读取矩阵之间的进度(如果您有多个)

这是一些测量数据。通过简单地设置compress=FALSE,加载速度将加倍。但是通过编写一个简单的矩阵序列化程序,加载速度几乎快了20倍

x <- matrix(runif(1e7), 1e5) # Matrix with 100k rows and 100 columns

system.time( save('x', file='c:/foo.bin') ) # 13.26 seconds
system.time( load(file='c:/foo.bin') ) # 2.03 seconds

system.time( save('x', file='c:/foo.bin', compress=FALSE) ) # 0.86 seconds
system.time( load(file='c:/foo.bin') ) # 0.92 seconds

system.time( saveMatrix(x, 'c:/foo.bin') ) # 0.70 seconds
system.time( y <- loadMatrix('c:/foo.bin') ) # 0.11 seconds !!!
identical(x,y)

x我不知道你是如何制作进度条的,但你是否考虑过至少显示一个计时器?我发现运行计时器会使等待更快,然后我知道程序仍在响应。您可以显示一条消息,如
您一直在等待1:32,等待时间通常为~3分钟。喝杯咖啡前面的两个问题:并建议
txtProgressBar
gtkProgressBar
。后者来自RGtk2软件包。这些是您正在寻找的吗?抱歉,我错过了您已经知道的
txtProgressBar
函数,您的问题实际上是关于加载.Rdata文件的。load还没有进度条的挂钩-R是开源的,因此您可以通过编程添加它们…我们只需要加载一个包含多个(3+)的矩阵大小不一。我考虑过将矩阵分解成几个部分,然后分别阅读它们,但这是一个丑陋的解决方案,不值得为进度条增加复杂性……因此,上面的loadMatrix应该会大大加快速度。。。你试过了吗?用于保存和加载非常大的数值矩阵的方法,也是一个好的快速解决方案。
> a <- 1:100000000
> saveObj(a, "temp.RData")
> b <- loadObj("temp.RData")
  |======================================================================| 100%
> all.equal(b, a)
[1] TRUE
> 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
x <- matrix(runif(1e7), 1e5) # Matrix with 100k rows and 100 columns

system.time( save('x', file='c:/foo.bin') ) # 13.26 seconds
system.time( load(file='c:/foo.bin') ) # 2.03 seconds

system.time( save('x', file='c:/foo.bin', compress=FALSE) ) # 0.86 seconds
system.time( load(file='c:/foo.bin') ) # 0.92 seconds

system.time( saveMatrix(x, 'c:/foo.bin') ) # 0.70 seconds
system.time( y <- loadMatrix('c:/foo.bin') ) # 0.11 seconds !!!
identical(x,y)
saveMatrix <- function(m, fileName) {
    con <- file(fileName, 'wb')
    on.exit(close(con))
    writeBin(dim(m), con)
    writeBin(typeof(m), con)
    writeBin(c(m), con)
}

loadMatrix <- function(fileName) {
    con <- file(fileName, 'rb')
    on.exit(close(con))
    d <- readBin(con, 'integer', 2)
    type <- readBin(con, 'character', 1)
    structure(readBin(con, type, prod(d)), dim=d)
}