file - precarga - ¿Cómo creo una barra de progreso para la carga de datos en R?
subir archivos con ajax y mostrar precarga (2)
¿Podría sugerir, en cambio, acelerar los tiempos de carga (y guardar) para que no se necesite una barra de progreso? Si la lectura de una matriz es "rápida", podría informar el progreso entre cada matriz de lectura (si tiene muchas).
Aquí hay algunas medidas. Simplemente configurando compress = FALSE, la velocidad de carga se duplica. Pero al escribir un simple serializador matricial, la velocidad de carga es casi 20 veces más rápida.
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)
Donde saveMatrix / loadMatrix se define de la siguiente manera. Actualmente no manejan dimnames y otros atributos, pero eso podría agregarse fácilmente.
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)
}
¿Es posible crear una barra de progreso para los datos cargados en R usando load() ?
Para un proyecto de análisis de datos, se están cargando grandes matrices en R desde archivos .RData, que demoran varios minutos en cargarse. Me gustaría tener una barra de progreso para controlar cuánto tiempo pasará antes de que se carguen los datos. R ya tiene una buena funcionalidad de barra de progreso integrada, pero load () no tiene ningún gancho para monitorear la cantidad de datos que se han leído. Si no puedo usar la carga directamente, ¿existe una forma indirecta de crear una barra de progreso de este tipo? Quizás cargar el archivo .RData en mandriles y juntarlos para R. ¿Alguien tiene alguna idea o sugerencia sobre esto?
Se me ocurrió la siguiente solución, que funcionará para tamaños de archivo de menos de 2 ^ 32 - 1 bytes.
El objeto R debe ser serializado y guardado en un archivo, como lo hace el siguiente código.
saveObj <- function(object, file.name){
outfile <- file(file.name, "wb")
serialize(object, outfile)
close(outfile)
}
Luego leemos los datos binarios en fragmentos, haciendo un seguimiento de cuánto se lee y actualizando la barra de progreso en consecuencia.
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))
}
El código se puede ejecutar de la siguiente manera:
> a <- 1:100000000
> saveObj(a, "temp.RData")
> b <- loadObj("temp.RData")
|======================================================================| 100%
> all.equal(b, a)
[1] TRUE
Si comparamos el método de la barra de progreso con la lectura del archivo en un solo fragmento, veremos que el método de la barra de progreso es un poco más lento, pero no lo suficiente como para preocuparse.
> 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
Entonces, mientras el método anterior funciona, siento que es completamente inútil debido a las restricciones de tamaño del archivo. Las barras de progreso solo son útiles para archivos grandes que toman mucho tiempo para leer.
¡Sería genial si alguien pudiera encontrar algo mejor que esta solución!