2012-03-14 7 views
23

私はSPSSにエクスポートしたいRのかなり大きなデータフレームを持っています。 このファイルは、まず頭にRにインポートしようと数時間の頭痛を引き起こしましたが、read.fwf()オプションを使用して成功しました。comment.char="%"(文字はファイルには表示されません)とfill= TRUE(固定長のASCIIファイル一部の行にすべての変数が不足しているため、エラーメッセージが表示されます)。大きな(3.9ミルobs)data.framesをテキストファイルにエクスポートする最も効率的な方法は?

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

何年にもわたって大規模なデータセットにRが適していないという事例を聞いた後、私はこの種の問題に実際に遭遇したのは初めてです。私は他のアプローチがあるのだろうか(低レベルの "ダンプ"ファイルを直接ディスクに書き込んでいますか?)、またはこのタイプの大きなファイルのエクスポートを効率的に処理できる何か不明なパッケージがあるかどうかは疑問です。

答えて

7

あなたのマシンはRAMが不足しているため、Rはスワップファイルを使用する必要があり、処理が遅くなります。あなたがコードに支払われている場合、RAMを増やすことはおそらくあなたが新しいコードを書くよりも安くなるでしょう。

しかし、いくつかの可能性があります。ファイルをデータベースにエクスポートし、そのデータベースの機能を使用してテキストファイルに書き込むことができます。 this questionへのJD Longの答えは、この方法でファイルを読み込む方法を示しています。プロセスを逆にすることはあまり難しいことではありません。代わりに、bigmemoryffパッケージ(Davyが述べたような)をこのようなファイルの書き込みに使用することもできます。

+0

こんにちはリッチー、私は8 Gb RAMがこのデータセットであっても "RAM上で短く"なるかどうかは分かりません。しかし、私はJD Longが提案した 'sqldf()'を使って分析します。ポインタありがとう! – jans

7

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

+0

私は 'ff()'で自分の運を試しましたが、使用されている構文に困惑していました。私の頭の中で私の頭を包み込むことはできませんでした。元のデータセットのサブセットで試してみると、時間が賢明になりました。とにかくありがとう。 – jans

7

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

私の情報をチェックアウトする過程で、私は掬ったことがあることに注意してください。

24

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

2)また、1000000行のチャンクに書きますが、常に同じファイルに書き出し、引数はappend = TRUEです。

+1

本当に巧妙な解決策。変数が異なる型のdata.framesでは動作しませんが、ここでは間違いなく良い修正ができます! –

+0

hehe、私はほぼ同じ次元のデータで同じことをしなければならなかった:あなたは米国の出生または死のマイクロデータで働いていないだろうか? –

+0

@tim riffe:いいえ、しかし、これらは牛の出産と分娩のデータです。 – jans

13

更新

マットDowleによって広範囲の仕事は、他の効率改善を並列化し、追加した後、freadは今write.csvより速く15Xと同じくらいです。詳しくは、リンクされた回答を参照してください。


data.table一般的にwrite.csvの約2倍の速さであるように思わオットーSeiskariによって寄与fwrite機能を持っています。いくつかのベンチマークについては、hereを参照してください。

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

data.tableタイプでは行名が使用されないため、行名は除外されています。

関連する問題