2017-05-11 4 views
0

まずで管理するメモリ割り当て、この質問を約は、r:ループ

Error: cannot allocate vector of size n

与えられたとして、私はこのエラーを受け入れ、私は私が持っている

  • コード内のエラーを回避しようとしていますではありません3000個の+変数と12万例

  • すべての列が数値のデータセット

  • NAをゼロでリセットする必要があります

  • データセット全体で値を0に再割り当てすると、メモリが 割り当てエラーになります。

  • だから私は一度ゼロ1列に値を再割り当てしています: `約1000列の後

    resetNA <- function(results) 
    { 
        for (i in 1:ncol(results)) 
        { 
          if(i>10) 
          { 
            results[,i][is.na(results[,i])] <- 0 
          } 
        } 
        print(head(results)) 
    } 
    

、私はまだメモリ割り当てエラーが発生します。

これは私にとっては奇妙なことです。何らかの形で、各ループの後にメモリの割り当てが増加しています。しかし、なぜこれが当てはまるのかわかりません。

また、ループごとにガベージコレクション関数を呼び出そうとしましたが、まだメモリ割り当てエラーがあります。

メモリ割り当ての増加が避けられるように変数を管理する方法を教えてもらえますか(結局のところ、データフレームのサイズは変更されていません)。

+1

は、リストに関数を適用し、リストにデータを分割し、その後 –

+0

感謝を再結合し、私はそれを試してみますよ。しかし、このループがインクリメンタルメモリ割り当てを引き起こす理由を説明できますか? – Jake

+0

また、答えを投稿してくださいと私はupvoteしてください。私は自分自身の質問に回答を投稿するのが嫌いですが、質問を残して嫌いであれば、これはもっと助かります – Jake

答えて

0

に動作します。データフレームをループする可能避けWhereever

See this discussion.

。 lapplyを使用してください。これは、データフレームをリストに変換して、関連する関数をリスト上で実行します。その後、リストを返します。リストをデータフレームに戻します。

次の例では、数値の頻度をカテゴリ変数に再コードしています。これは高速で、メモリ使用量を増加させません。

list1<-lapply(mybigdataframe,function(x) ifelse(x>0,"Yes","No")) 
    newdf1<-as.data.frame(list1)