Các xlsxgó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.OutOfMemoryErrorcó 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_sheetsvà 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 createSheetvà 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 exceededxảy ra lỗi khi chạy addDataFramelầ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?
xlsxgói choopenxlsxgói, gói phụ thuộc vàoRcppchứ không phải Java.