Các xlsx
gói có thể được sử dụng để đọc và viết bảng tính Excel từ R. Thật không may, ngay cả đối với các bảng tính khá lớn, java.lang.OutOfMemoryError
có thể xảy ra. Đặc biệt,
Lỗi trong .jcall ("RJavaTools", "Ljava / lang / Object;", "invokeMethod", cl,:
java.lang.OutOfMemoryError: Java heap spaceLỗi trong .jcall ("RJavaTools", "Ljava / lang / Object;", "newInstance", .jfindClass (class),:
java.lang.OutOfMemoryError: GC overheadhead limit
(Các trường hợp ngoại lệ liên quan khác cũng có thể xảy ra nhưng hiếm hơn.)
Một câu hỏi tương tự đã được hỏi về lỗi này khi đọc bảng tính.
Ưu điểm chính của việc sử dụng bảng tính Excel làm phương tiện lưu trữ dữ liệu so với CSV là bạn có thể lưu trữ nhiều trang tính trong cùng một tệp, vì vậy ở đây chúng tôi xem xét danh sách các khung dữ liệu được ghi một khung dữ liệu trên mỗi trang tính. Tập dữ liệu mẫu này chứa 40 khung dữ liệu, mỗi khung có hai cột với tối đa 200 nghìn hàng. Nó được thiết kế đủ lớn để có vấn đề, nhưng bạn có thể thay đổi kích thước bằng cách thay đổi n_sheets
và 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))
Phương pháp tự nhiên để ghi điều này vào tệp là tạo một sổ làm việc bằng cách sử dụng createWorkbook
, sau đó lặp qua mỗi khung dữ liệu gọi createSheet
và addDataFrame
. Cuối cùng sổ làm việc có thể được ghi vào tệp bằng cách sử dụng saveWorkbook
. Tôi đã thêm tin nhắn vào vòng lặp để giúp bạn dễ dàng nhìn thấy nơi nó rơi xuống.
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")
Chạy tính năng này ở chế độ 64-bit trên máy có RAM 8GB, nó sẽ GC overhead limit exceeded
xảy ra lỗi khi chạy addDataFrame
lần đầu tiên.
Làm cách nào để ghi các tập dữ liệu lớn vào bảng tính Excel xlsx
?
xlsx
gói choopenxlsx
gói, gói phụ thuộc vàoRcpp
chứ không phải Java.