web-dev-qa-db-ja.com

大きな(390万obs)data.framesをテキストファイルにエクスポートする最も効率的な方法は?

Rにかなり大きなデータフレームがあり、SPSSにエクスポートしたいと思います。このファイルは、そもそもRにインポートしようとすると何時間も頭を悩ませましたが、オプションcomment.char="%"(ファイルに表示されない文字)とfill= TRUE(ファイルに表示されない文字)を使用してread.fwf()を使用して成功しました。固定幅ASCIIファイルで、一部の行にすべての変数がないため、エラーメッセージが表示されます)。

とにかく、私のデータフレームは現在、3,9ミルの観測値と48の変数(すべての文字)で構成されています。 df2 <- df[1:1000000,]の後にwrite.table(df2)などを使用して4x 1ミルのobsセットに分割することで、ファイルにかなりすばやく書き込むことができますが、コンピューターがロックされて必要になることなく、ファイル全体を1回のスイープで書き込むことはできません。復帰するためのハードリセット。

Rが大規模なデータセットにどのように適していないかについての逸話を何年も聞いた後、私が実際にこの種の問題に遭遇したのはこれが初めてです。他のアプローチ(ファイルをディスクに直接「ダンプ」する低レベルの「ダンプ」)があるのか​​、それともこのタイプの大きなファイルのエクスポートを効率的に処理できる未知のパッケージがあるのだろうか?

23
jans

推測では、マシンのRAMが不足しているため、Rはスワップファイルを使用する必要があり、速度が低下します。コードにお金を払っているのなら、RAMをもっと買うほうが、新しいコードを書くよりもおそらく安いでしょう。

とはいえ、いくつかの可能性があります。ファイルをデータベースにエクスポートしてから、そのデータベースの機能を使用してテキストファイルに書き込むことができます。 この質問 に対するJD Longの回答は、この方法でファイルを読み取る方法を示しています。プロセスを逆にするのはそれほど難しいことではありません。あるいは、bigmemoryおよびffパッケージ(Davyが言及)を使用して、このようなファイルを書き込むこともできます。

7
Richie Cotton

1)ファイルがすべて文字列である場合、最初にmatrixに変更すると、write.table()を使用してはるかに高速に保存されます。

2)引数append = TRUEを使用して、たとえば1000000行のチャンクで、ただし常に同じファイルに書き込みます。

24
tim riffe

更新

Matt Dowleによる広範な作業の並列化とその他の効率改善の追加の後、freadwrite.csvよりも15倍も高速になりました。詳細については、リンクされた回答を参照してください。


現在、data.tableにはOttoSeiskariによって提供されたfwrite関数があり、これは一般にwrite.csvの約2倍の速度のようです。いくつかのベンチマークについては、 ここ を参照してください。

library(data.table) 
fwrite(DF, "output.csv")

data.tableタイプは行名を使用しないため、行名は除外されることに注意してください。

14
MichaelChirico

まあ、本当に大きなファイルとRでの答えはよくあることですが、この種の作業をデータベースにオフロードするのが最善です。 SPSSにはODBC接続性があり、RODBCはRからSQLへのインターフェースを提供します。

私の情報をチェックする過程で、私はすくわれたことに注意します。

7
richiemorrisroe

非常に大きなファイル(10 Gb以上)を読み取るためにのみ使用しますが、ffパッケージには非常に大きなdfを書き込むための関数があると思います。

7
Davy Kavanagh