El xlsx
paquete se puede utilizar para leer y escribir hojas de cálculo de Excel desde R. Desafortunadamente, incluso para hojas de cálculo moderadamente grandes, java.lang.OutOfMemoryError
puede ocurrir. En particular,
Error en .jcall ("RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl,:
java.lang.OutOfMemoryError: Java heap spaceError en .jcall ("RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (clase),:
java.lang.OutOfMemoryError: se superó el límite de sobrecarga de GC
(Otras excepciones relacionadas también son posibles pero más raras).
Se hizo una pregunta similar con respecto a este error al leer hojas de cálculo.
¿Importando un archivo xlsx grande a R?
La principal ventaja de usar hojas de cálculo de Excel como medio de almacenamiento de datos sobre CSV es que puede almacenar varias hojas en el mismo archivo, por lo que aquí consideramos una lista de marcos de datos para escribir un marco de datos por hoja de trabajo. Este conjunto de datos de ejemplo contiene 40 marcos de datos, cada uno con dos columnas de hasta 200.000 filas. Está diseñado para ser lo suficientemente grande como para ser problemático, pero puede cambiar el tamaño modificando n_sheets
y n_rows
.
library(xlsx)
set.seed(19790801)
n_sheets <- 40
the_data <- replicate(
n_sheets,
{
n_rows <- sample(2e5, 1)
data.frame(
x = runif(n_rows),
y = sample(letters, n_rows, replace = TRUE)
)
},
simplify = FALSE
)
names(the_data) <- paste("Sheet", seq_len(n_sheets))
El método natural de escribir esto en un archivo es crear un libro de trabajo usando createWorkbook
, luego recorrer cada marco de datos llamando createSheet
y addDataFrame
. Finalmente, el libro de trabajo se puede escribir en un archivo usando saveWorkbook
. Agregué mensajes al bucle para que sea más fácil ver dónde se cae.
wb <- createWorkbook()
for(i in seq_along(the_data))
{
message("Creating sheet", i)
sheet <- createSheet(wb, sheetName = names(the_data)[i])
message("Adding data frame", i)
addDataFrame(the_data[[i]], sheet)
}
saveWorkbook(wb, "test.xlsx")
Al ejecutar esto en 64 bits en una máquina con 8 GB de RAM, arroja el GC overhead limit exceeded
error mientras se ejecuta addDataFrame
por primera vez.
¿Cómo escribo grandes conjuntos de datos en hojas de cálculo de Excel usando xlsx
?
xlsx
paquete por elopenxlsx
paquete, que dependeRcpp
de Java en lugar de hacerlo.