xlsxPakiet może być wykorzystany do odczytu i zapisu arkuszy kalkulacyjnych Excel z R. Niestety, nawet dla średnio dużych arkuszy, java.lang.OutOfMemoryErrormoż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_sheetsi 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 createSheeti 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 exceededbłędu podczas addDataFramepierwszego uruchomienia.
Jak pisać duże zbiory danych do arkuszy kalkulacyjnych programu Excel za pomocą xlsx?
xlsxpakiet naopenxlsxpakiet, który jest zależnyRcppraczej od języka Java.