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 .readxl
ist eine weitere neue C / C ++ - Alternative, die vielversprechend aussieht.options(java.parameters = "-Xmx8000m")
vor BelastungrJava
,xlsxjars
,xlsx
gelöstError 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
in RHEL 6.3 x86_64, Java 1.7.0_79 (Oracle), rJava_0.9-7, xlsxjars_0.6.0, xlsx_0.5.7Aufbauend auf der Antwort von @ richie-Cotton fand ich, dass das Hinzufügen
gc()
derjgc
Funktion die CPU-Auslastung niedrig hielt.jgc <- function() { gc() .jcall("java/lang/System", method = "gc") }
Meine vorherige
for
Schleife hatte immer noch Probleme mit der ursprünglichenjgc
Funktion, aber mit einem zusätzlichen Befehl wird keineGC overhead limit exceeded
Fehlermeldung mehr angezeigt.quelle
Sie können gc () auch innerhalb der Schleife verwenden, wenn Sie Zeile für Zeile schreiben. gc () steht für Garbage Collection. gc () kann in jedem Fall von Speicherproblemen verwendet werden.
quelle
Lösung für den obigen Fehler: Bitte verwenden Sie den unten angegebenen R-Code:
detach(package:xlsx) detach(package:XLConnect) library(openxlsx)
Versuchen Sie erneut, die Datei zu importieren, und Sie erhalten keine Fehlermeldung, da dies für mich funktioniert.
quelle
Ich hatte Probleme mit write.xlsx () anstatt zu lesen ... aber dann wurde mir klar, dass ich versehentlich 32-Bit-R ausgeführt habe. Durch Auswechseln auf 64-Bit wurde das Problem behoben.
quelle