Das xlsx
Paket kann zum Lesen und Schreiben von Excel-Tabellen aus R verwendet werden. Leider kann es auch bei mäßig großen Tabellen java.lang.OutOfMemoryError
vorkommen. Speziell,
Fehler in .jcall ("RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl ,:
java.lang.OutOfMemoryError: Java- HeapspeicherFehler in .jcall ("RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (Klasse) ,:
java.lang.OutOfMemoryError: GC-Overhead-Limit überschritten
(Andere verwandte Ausnahmen sind ebenfalls möglich, aber seltener.)
Eine ähnliche Frage wurde zu diesem Fehler beim Lesen von Tabellen gestellt.
Eine große XLSX-Datei in R importieren?
Der Hauptvorteil der Verwendung von Excel-Tabellen als Datenspeichermedium gegenüber CSV besteht darin, dass Sie mehrere Blätter in derselben Datei speichern können. Daher betrachten wir hier eine Liste von Datenrahmen, die als ein Datenrahmen pro Arbeitsblatt geschrieben werden sollen. Dieses Beispieldatensatz enthält 40 Datenrahmen mit jeweils zwei Spalten mit bis zu 200.000 Zeilen. Es ist groß genug, um problematisch zu sein, aber Sie können die Größe ändern, indem Sie n_sheets
und ändern 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))
Die natürliche Methode zum Schreiben in eine Datei besteht darin, eine Arbeitsmappe mit zu erstellen createWorkbook
und dann jeden Datenrahmen aufzurufen, der createSheet
und aufruft addDataFrame
. Schließlich kann die Arbeitsmappe mit in eine Datei geschrieben werden saveWorkbook
. Ich habe der Schleife Nachrichten hinzugefügt, damit Sie leichter erkennen können, wo sie umfällt.
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")
Wenn Sie dies in 64-Bit auf einem Computer mit 8 GB RAM ausführen, wird der GC overhead limit exceeded
Fehler beim ersten Ausführen ausgegeben addDataFrame
.
Wie schreibe ich große Datenmengen in Excel-Tabellen xlsx
?
xlsx
Paket gegen dasopenxlsx
Paket ausgetauscht wird , dasRcpp
eher von Java als von Java abhängt .