この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スプレッドシートを使用する主な利点は、同じファイルに複数のシートを保存できることです。そこで、ここでは、データフレームのリストをワークシートごとに1つのデータフレームと見なします。このサンプルデータセットには40個のデータフレームが含まれ、各フレームには最大200k行の2つの列があります。問題があることが十分に大きいように設計されていますが、変更することによってサイズを変更することができます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
いるopenxlsx
パッケージとパッケージを交換することで回避できるようになりましたRcpp
。