2016-09-25 4 views
2

私が現在取り組んでいるプロジェクトについて、私は作業中のコードの速度を段階的に上げようとしています。プロジェクトは現在、プロジェクトを開始するには、10M-1B行と24列の間のどこかでデータフレームを初期化する必要があります。最初の8列は文字列、次の16列は整数なので、文字列のために行列ではなくデータフレームでなければなりません。R - できるだけ早くデータフレームを初期化する

現在、私は持っている:

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = as.data.frame(matrix(nrow = total_num_lineups, ncol = 24)) 

Sys.time() - starttime 
# Time difference of 44.70181 secs 

100M行に対して約45秒をとります。このプロジェクトは1B行以上の拡張が可能で、これが私が修正しようとしている最初のボトルネックです。このステップをどのようにスピードアップするかについてのご意見は、大変に感謝しています。

追加 - 私は必要に応じてプロジェクトに関する追加情報を提供することができますが、問題によって焦点を絞った問題がより良いかもしれないと考えました。より高速であれば、コンテナを(データテーブルや他の構造に)切り替えることができます。

ありがとうございます!

+0

これをどのように実行しましたか。必要な列の種類を取得するには、次のようにします。 「エラー:サイズ8.9Gbのベクトルを割り当てることができません」 –

+0

リッチで、メモリの問題であると推測します。この大きなメモリ内オブジェクトを扱うことは、特定のシステムが処理できるものの限界を押し上げる可能性があります。私のマシンは上記のコードに問題はありませんでした。 – jrdnmdhl

+2

あなたはこのステップが必須かどうか肯定的ですか? – rawr

答えて

3

このサイズのものを作るには、data.tableパッケージが必要です。

以下のコードはdata.frameを初期化しますが、1行のみでdata.tableに変換し、最初の行を指定された次元に繰り返します。あなたが欲しい示されるように、あなたはdata.frameを初期化する方法は、すべての列ダブルスではなく、文字/整数を作ること

library(data.table) 

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = as.data.frame(matrix(nrow = 1, ncol = 24)) 
dt = as.data.table(lineup) 
testit = dt[rep(1,total_num_lineups)] 

Sys.time() - starttime 
# Time difference of 15.08011 secs 

注意。

library(data.table) 

starttime = Sys.time() 
total_num_lineups = 100000000 
lineup = data.frame(
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    character(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1), 
    integer(1) 
) 
dt = as.data.table(lineup) 
lineup = dt[rep(1,total_num_lineups)] 

Sys.time() - starttime 
# Time difference of 15.08011 secs 
+0

なぜ 'data.frame'に変換してから' data.table'に変換するのですか? 'data.table'や' as.data.table'で直接データを作成したり、 'setDT(lineup)'を実行して 'data.frame'を' data.table' *に変換することもできます。また、 'data.table'と' data.frame'のパフォーマンスを比較していません。また、 'matrix'の中で' dt [rep(1、total_num_lineups)] 'を実行する方が、両方より高速かもしれません。全体として、ちょうど "* data.tableは行く方法です!"と言っても、IMOの証拠は十分に難しくありません。 –

関連する問題