R で採用されている関数型プログラミングのパラダイムは、関数が引数として渡されたオブジェクトを変更しないことを定めているため、R 関数は引数を変更する場合、引数をコピーすることが多いことを理解する必要があります。そのため、関数の実行中に変更が必要な場合、R はそれらをコピーします。
メモリ トレース サポートを使用して R をビルドすると、問題のある操作に対してこのコピーが実行されていることがわかります。サンプル データ セットを使用して、airquality
メモリの使用状況をトレース
> head(airquality)
Ozone Solar.R Wind Temp Month Day
1 41 190 7.4 67 5 1
2 36 118 8.0 72 5 2
3 12 149 12.6 74 5 3
4 18 313 11.5 62 5 4
5 NA NA 14.3 56 5 5
6 28 NA 14.9 66 5 6
> tracemem(airquality)
[1] "<0x12b4f78>"
> write.csv(airquality, "airquality.csv")
tracemem[0x12b4f78 -> 0x1aac0d8]: as.list.data.frame as.list lapply unlist which write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0x1aabf20]: as.list.data.frame as.list lapply sapply write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0xf8ae08]: as.list.data.frame as.list lapply write.table eval eval eval.parent write.csv
tracemem[0x12b4f78 -> 0xf8aca8]: write.table eval eval eval.parent write.csv
tracemem[0xf8aca8 -> 0xca7fe0]: [<-.data.frame [<- write.table eval eval eval.parent write.csv
tracemem[0xca7fe0 -> 0xcaac50]: [<-.data.frame [<- write.table eval eval eval.parent write.csv
これは、R がファイルへの書き込みの準備をするときに、データの 6 つのコピーが作成されていることを示しています。
明らかに、利用可能な 24Gb の RAM を使い果たしています。エラーは、操作を完了するために R がさらに1.2Gb の RAM を必要とすることを示しています。
最初の最も簡単な解決策は、ファイルをチャンクで書き込むことです。を使用してデータの最初の行セットを書き出し、その後の呼び出しで をappend = FALSE
使用して残りのチャンクを書き出します。利用可能なメモリを超えないチャンクサイズを見つけるために、これをいじる必要があるかもしれません。append = TRUE
write.csv()