xlsx
Pakiet może być wykorzystany do odczytu i zapisu arkuszy kalkulacyjnych Excel z R. Niestety, nawet dla średnio dużych arkuszy, java.lang.OutOfMemoryError
może wystąpić. W szczególności,
Błąd w .jcall („RJavaTools”, „Ljava / lang / Object;”, „invokeMethod”, cl,:
java.lang.OutOfMemoryError: Java heap spaceBłąd w .jcall ("RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (klasa),:
java.lang.OutOfMemoryError: Przekroczono limit narzutu GC
(Inne powiązane wyjątki są również możliwe, ale rzadsze).
Podobne pytanie padło w związku z tym błędem podczas czytania arkuszy kalkulacyjnych.
Importujesz duży plik xlsx do R?
Główną zaletą używania arkuszy kalkulacyjnych Excel jako nośnika danych w porównaniu z CSV jest to, że można przechowywać wiele arkuszy w tym samym pliku, dlatego tutaj rozważamy listę ramek danych do zapisania po jednej ramce danych na arkusz. Ten przykładowy zestaw danych zawiera 40 ramek danych, każda z dwiema kolumnami po maksymalnie 200 tys. Wierszy. Został zaprojektowany tak, aby był wystarczająco duży, aby był problematyczny, ale możesz zmienić rozmiar, zmieniając n_sheets
i 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))
Naturalną metodą zapisywania tego do pliku jest utworzenie skoroszytu za pomocą createWorkbook
, a następnie pętla nad każdym wywołaniem ramki danych createSheet
i addDataFrame
. Wreszcie skoroszyt można zapisać do pliku za pomocą saveWorkbook
. Dodałem wiadomości do pętli, aby łatwiej było zobaczyć, gdzie się przewraca.
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")
Uruchomienie tego w wersji 64-bitowej na komputerze z 8 GB pamięci RAM powoduje zgłoszenie GC overhead limit exceeded
błędu podczas addDataFrame
pierwszego uruchomienia.
Jak pisać duże zbiory danych do arkuszy kalkulacyjnych programu Excel za pomocą xlsx
?
xlsx
pakiet naopenxlsx
pakiet, który jest zależnyRcpp
raczej od języka Java.readxl
to kolejna nowa alternatywa C / C ++, która wygląda obiecująco.options(java.parameters = "-Xmx8000m")
przed obciążeniemrJava
,xlsxjars
,xlsx
rozwiązaneError 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
w RHEL 6,3 86_64, Java 1.7.0_79 (Oracle) rJava_0.9-7, xlsxjars_0.6.0, xlsx_0.5.7Opierając się na odpowiedzi @ richie-cotton, stwierdziłem, że dodanie
gc()
dojgc
funkcji utrzymało niskie zużycie procesora.jgc <- function() { gc() .jcall("java/lang/System", method = "gc") }
Moja poprzednia
for
pętla nadal walczyła z oryginalnąjgc
funkcją, ale dzięki dodatkowemu poleceniu nie pojawia się jużGC overhead limit exceeded
komunikat o błędzie.źródło
Możesz także użyć gc () wewnątrz pętli, jeśli piszesz wiersz po wierszu. gc () oznacza odśmiecanie. gc () może być użyte w każdym przypadku problemu z pamięcią.
źródło
Rozwiązanie powyższego błędu: użyj poniższego r - kodu:
Spróbuj ponownie zaimportować plik, a nie pojawi się żaden błąd, ponieważ działa dla mnie.
źródło
Miałem problemy z write.xlsx (), zamiast czytać ... ale potem zdałem sobie sprawę, że przypadkowo pracowałem z 32-bitowym R. Zamiana go na 64-bitową rozwiązała problem.
źródło