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が大規模なデータセットにどのように適していないかについての逸話を何年も聞いた後、私が実際にこの種の問題に遭遇したのはこれが初めてです。他のアプローチ(ファイルをディスクに直接「ダンプ」する低レベルの「ダンプ」)があるのか、それともこのタイプの大きなファイルのエクスポートを効率的に処理できる未知のパッケージがあるのだろうか?
推測では、マシンのRAMが不足しているため、Rはスワップファイルを使用する必要があり、速度が低下します。コードにお金を払っているのなら、RAMをもっと買うほうが、新しいコードを書くよりもおそらく安いでしょう。
とはいえ、いくつかの可能性があります。ファイルをデータベースにエクスポートしてから、そのデータベースの機能を使用してテキストファイルに書き込むことができます。 この質問 に対するJD Longの回答は、この方法でファイルを読み取る方法を示しています。プロセスを逆にするのはそれほど難しいことではありません。あるいは、bigmemory
およびff
パッケージ(Davyが言及)を使用して、このようなファイルを書き込むこともできます。
1)ファイルがすべて文字列である場合、最初にmatrix
に変更すると、write.table()
を使用してはるかに高速に保存されます。
2)引数append = TRUE
を使用して、たとえば1000000行のチャンクで、ただし常に同じファイルに書き込みます。
Matt Dowleによる広範な作業の並列化とその他の効率改善の追加の後、fread
はwrite.csv
よりも15倍も高速になりました。詳細については、リンクされた回答を参照してください。
現在、data.table
にはOttoSeiskariによって提供されたfwrite
関数があり、これは一般にwrite.csv
の約2倍の速度のようです。いくつかのベンチマークについては、 ここ を参照してください。
library(data.table)
fwrite(DF, "output.csv")
data.table
タイプは行名を使用しないため、行名は除外されることに注意してください。
まあ、本当に大きなファイルとRでの答えはよくあることですが、この種の作業をデータベースにオフロードするのが最善です。 SPSSにはODBC接続性があり、RODBC
はRからSQLへのインターフェースを提供します。
私の情報をチェックする過程で、私はすくわれたことに注意します。
非常に大きなファイル(10 Gb以上)を読み取るためにのみ使用しますが、ff
パッケージには非常に大きなdfを書き込むための関数があると思います。