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.readxl
es otra nueva alternativa de C / C ++ que parece prometedora.options(java.parameters = "-Xmx8000m")
antes de la cargarJava
,xlsxjars
,xlsx
resueltoError in .jcall("RJavaTools", "Ljava/lang/Object;", "invokeMethod", cl, : org.apache.poi.POIXMLException: java.lang.reflect.InvocationTargetException Calls: getNetwork ... <Anonymous> -> .jrcall -> .jcall -> .jcheck -> .Call Execution halted
en RHEL 6.3 x86_64, Java 1.7.0_79 (Oracle), rJava_0.9-7, xlsxjars_0.6.0, xlsx_0.5.7Sobre la base de la respuesta de @ richie-cotton, descubrí que agregar
gc()
a lajgc
función mantenía bajo el uso de la CPU.jgc <- function() { gc() .jcall("java/lang/System", method = "gc") }
Mi
for
ciclo anterior todavía tenía problemas con lajgc
función original , pero con un comando adicional, ya no me encuentro con elGC overhead limit exceeded
mensaje de error.fuente
También puede usar gc () dentro del ciclo si está escribiendo fila por fila. gc () significa recolección de basura. gc () se puede utilizar en cualquier caso de problema de memoria.
fuente
Solución para el error anterior: utilice el código r mencionado a continuación:
detach(package:xlsx) detach(package:XLConnect) library(openxlsx)
E intente importar el archivo nuevamente y no obtendrá ningún error, ya que funciona para mí.
fuente
Estaba teniendo problemas con write.xlsx () en lugar de leer ... pero luego me di cuenta de que había estado ejecutando accidentalmente 32bit R. Cambiarlo a 64bit solucionó el problema.
fuente