2016-08-29 5 views
2

は私が組み合わされたデータに関数を適用することができるようにデータフレームのリストにまとめていくつかのファイルを読んでいますが、私はあまりにも多くのデータフレームを持っているとき、私は、メモリ割り当ての問題に実行しています(「エラー:Rはメモリを割り当てることができません」) 。多くのデータフレームを格納するRメモリ効率的な方法?

フレームが読み込まれたデータの可変数は、今や3データフレームのために言うことができます:

x = data.frame(A=rnorm(100), B=rnorm(200)) 
y = data.frame(A=rnorm(30), B=rnorm(300)) 
z = data.frame(A=rnorm(20), B=rnorm(600)) 
listDF <- list(x,y,z) 

エラー:Rは、私はここで誰かが知っているかどうかを疑問に思った

メモリに割り当てることができないかどうかたとえば、[配列または1つのデータフレーム多くの列を持つ]は、データフレームの格納と操作のより効率的な方法になります。私は、データフレームの名前に基づいたデータで多くの列を操作することができますので、

データフレームのリストは、データフレームの可変数を扱うとき、これは便利です、非常に実用的な方法です。とにかく、あなたがこれをしたいと思っているアイデアや方法があれば、それらを共有してください:)ありがとう!

+2

このチェックアウトhttp://stackoverflow.com/questions/11486369/growing-a-data-frame-in-a-memory-efficient-manner – Daniel

+4

実行中の実際のコードのメモリをより効率的にするには、特定のコードを参照してください。大まかに言えば、RAM制限を打つと、(1)RAMを大幅に増やしたコンピュータを手に入れることができます。(2)ディスク上のデータをfiles/dbに保存し、処理のために一度に小さなチャンクを引っ張ってください。 – joran

+0

ダニエルありがとう!私は文字と数字の両方の列を持っているので、私はできませんdata.tableソリューション、行列を試してみる...ありがとう!! – user971102

答えて

-2

あなたの例と機能のapply家族を言及するには、データフレームの構造、すなわち、それらはすべて同じ列を持って、同じであることを示唆しています。このような場合は、データの総容量(フレーム一緒にすべてのデータ)がまだ利用可能RAMに収まらない場合、次いで溶液は、余分なID列を持つ1つの大きなdata.tableにすべてのデータをパックすることができれば

。これは、関数rbindlistで達成することができる。

library(data.table) 
x <- data.table(A = rnorm(100), B = rnorm(200)) 
y <- data.table(A = rnorm(30), B = rnorm(300)) 
z <- data.table(A = rnorm(20), B = rnorm(600)) 
dt <- rbindlist(list(x, y, z), idcol = TRUE) 
dt 
     .id   A   B 
    1: 1 -0.10981198 -0.55483251 
    2: 1 -0.09501871 -0.39602767 
    3: 1 2.07894635 0.09838722 
    4: 1 -2.16227936 0.04620932 
    5: 1 -0.85767886 -0.02500463 
    ---        
1096: 3 1.65858606 -1.10010088 
1097: 3 -0.52939876 -0.09720765 
1098: 3 0.59847826 0.78347801 
1099: 3 0.02024844 -0.37545346 
1100: 3 -1.44481850 -0.02598364 

.id変数によってdistinghuishedすることができ、個々のソースデータフレームに由来する行。すべてのメモリ効率の良いdata.table操作は全ての行、選択行(dt[.id == 1, some_function(A)])またはグループ単位(dt[, another_function(B), by = .id])に適用することができます。

data.table操作がメモリ効率的ですが、RAMはまだ制限要因であるかもしれません。それは無料ではありませんので、このソリューションは理想的ではないかもしれない

tables() 
    NAME NROW NCOL MB COLS KEY 
[1,] dt 1,100 3 1 .id,A,B  
[2,] x  200 2 1 A,B   
[3,] y  300 2 1 A,B   
[4,] z  600 2 1 A,B   
Total: 4MB 

ともはや

rm(x, y, z) 
tables() 
    NAME NROW NCOL MB COLS KEY 
[1,] dt 1,100 3 1 .id,A,B  
Total: 1MB 
+0

あなたがここで報告するメモリの使用は誤解を招き、小さなデータテーブルのみを使用することによるアーチファクトです。 'x = y = z = data.table(A = rnorm(1e6)、B = rnorm(1e6))'でそれを試してみると、結合されたテーブルはx、y 、およびz。 – dww

+0

@dww追加の '.id'カラムに追加メモリが必要なので、これは正しいです。しかし、それはここでのポイントではありません。あなたが@ Luisへのあなたのコメントで指摘しているように、「データタブはメモリを節約することができますが、コピーすることなく行を追加、削除、修正する操作中です」 – Uwe

+0

OPの実数データは実際には同じ構造のものであるか、または単にOPが便利な例になりました。たとえそれらが結合可能であっても、あなたが正しい間に 'data.table'を使って処理中にメモリを減らすことができるのであれば、dwwのように、それらを1つの大きなdata.tableに入れます。これはあなたの答えの要点です - 彼らが最初に記憶に収まるのを助けるために何かをする。 – Gregor

-1

のDataTableはRで非常に効率的なデータ構造であり、多分彼らはあなたの場合に便利です見てみましょう。

+2

データテーブルは、データフレームよりメモリを占有しません*。実際、それらはデータフレームですが、追加クラスと関連するメソッドがあります。 data.tableがメモリを節約できるのは、コピーせずに行を追加、削除、または変更する操作の場合です – dww

1

を必要としているメモリからオブジェクトを削除:すべての作成data.tableオブジェクトのメモリ消費量を監視するためにtables()関数を使用しかし、Revolution R Enterpriseは、Rの大きなデータの問題に対処するように設計されています。Rの中のSQLのデータ操作機能のいくつかを使用して、大きなデータを高速に計算します。新しいデータ型に対応するための機能が異なるため、学習曲線がありますが、大きなデータを扱う場合は、速度を上げる価値があります。あなたがそれを学ぶ時間と製品のコストがより遅く、より多くのklugieの回避策のいくつかよりも貴重であるかどうかを判断するだけです。

関連する問題