이 xlsx
패키지는 R에서 Excel 스프레드 시트를 읽고 쓰는 데 사용할 수 있습니다. 안타깝게도 중간 크기의 스프레드 시트에서도 java.lang.OutOfMemoryError
발생할 수 있습니다. 특히,
.jcall ( "RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl, :
java.lang.OutOfMemoryError : Java 힙 공간에 오류가 있습니다..jcall ( "RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (class), :
java.lang.OutOfMemoryError : GC 오버 헤드 제한 초과
(기타 관련 예외도 가능하지만 더 드뭅니다.)
스프레드 시트를 읽을 때이 오류와 관련하여 유사한 질문이 제기되었습니다.
CSV보다 Excel 스프레드 시트를 데이터 저장 매체로 사용할 때의 주요 이점은 동일한 파일에 여러 시트를 저장할 수 있다는 것입니다. 따라서 여기서는 워크 시트 당 하나의 데이터 프레임을 작성하는 데이터 프레임 목록을 고려합니다. 이 예제 데이터 세트에는 40 개의 데이터 프레임이 포함되어 있으며 각 프레임에는 최대 200,000 개의 행이있는 두 개의 열이 있습니다. 문제가 될 수있는 충분히 큰 수 있도록 설계되어 있지만 변경하여 크기를 변경할 수 있습니다 n_sheets
및 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))
이 파일을 기록하는 자연있어서 사용 통합 문서를 생성하는 createWorkbook
각각의 데이터 프레임을 통해 호출 후, 루프 createSheet
와 addDataFrame
. 마지막으로 통합 문서는 saveWorkbook
. 루프가 어디로 넘어가는지 쉽게 볼 수 있도록 메시지를 루프에 추가했습니다.
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")
8GB RAM이있는 시스템에서 64 비트로 GC overhead limit exceeded
실행 addDataFrame
하면 처음 실행하는 동안 오류가 발생 합니다.
을 사용하여 대용량 데이터 세트를 Excel 스프레드 시트에 어떻게 작성 xlsx
합니까?
xlsx
패키지를 Javaopenxlsx
가Rcpp
아닌 종속 된 패키지 로 교체하여 회피 할 수 있습니다 .