4

私は9列のdata.frame(x)を持っていて、何百万もの行があります。私はそれをRに読み込むことができ、いくつかの変更を正常に行うことができ、コードは問題なく実行されました。ただし、を使用して.csvファイルに書き出そうとすると

write.csv(x,file=argv[2],quote=F,row.names=F)

エラーが発生します

Error: cannot allocate vector of size 1.2Gb

データはすでにメモリにあり、計算が行われているので、これは意味がありません。私がやりたいのは、データをディスクに書き出すことだけです。また、メモリを監視している間、この書き込みフェーズでは、このプロセスの仮想メモリサイズがほぼ2倍になりました。このdata.frameヘルプを書き出すためのカスタムC関数を作成しますか?任意の提案/ヘルプ/ポインタをいただければ幸いです。

ps:私はこれらすべてを約24GのRAMを搭載した64ビットのubuntuボックスで実行しています。全体的なスペースは問題ではないかもしれません。データサイズは約10Gです

4

1 に答える 1

9

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 = TRUEwrite.csv()

于 2012-05-26T19:17:24.967 に答える