2017-05-11 4 views
0

Erstens ist diese Frager: die Verwaltung von Speicherzuweisung in Schleifen

NICHT über

Error: cannot allocate vector of size n

ich diesen Fehler akzeptieren als gegeben und ich versuche, den Fehler im Code zu vermeiden

  • Ich habe ein Datensatz von 3000+ Variablen und 120000 Fälle

  • Alle Spalten sind numerisch

  • Ich muss NA mit Null zurücksetzen

  • Wenn ich Werte für 0 für den gesamten Datensatz neu zuweisen, erhalte ich den Speicher Zuordnungsfehler.

  • So bin Neuzuweisung ich die Werte auf Null einer Spalte zu einem Zeitpunkt: `

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

Nach etwa 1000 Spalten, bekomme ich immer noch die Speicherzuordnungsfehler.

Nun scheint mir das seltsam. Irgendwie erhöht sich die Speicherzuweisung nach jeder Schleife. Ich sehe jedoch nicht, warum dies der Fall sein würde.

Auch versuchte ich Garbage Collection-Funktion nach jeder Schleife aufrufen, ich habe immer noch die Speicherzuweisung Fehler.

Kann mir jemand erklären, wie ich die Variablen verwalten kann, um die schrittweise Erhöhung der Speicherzuweisung zu vermeiden (schließlich hat sich die Datenrahmengröße nicht geändert).

+1

teilen Sie Ihre Daten in Listen, gelten die Funktion auf die Listen, dann –

+0

Dank rekombinieren, ich werde es versuchen. Aber können Sie erklären, warum diese Schleife eine inkrementelle Speicherzuweisung verursacht? – Jake

+0

auch, bitte zögern Sie nicht, die Antwort zu posten, und ich werde upvote. Ich hasse es, Antworten auf meine eigenen Fragen zu veröffentlichen, aber hasse es, eine Frage noch unbeantwortet zu lassen. – Jake

Antwort

0

Ich habe einen wichtigen allgemeinen Grundsatz über r Speichernutzung gelernt.

See this discussion.

Überall dort, wo möglich vermeiden durch einen Datenrahmen Looping. Benutze den Schlafsack. Dies konvertiert einen Datenrahmen in eine Liste und führt dann die relevante Funktion in der Liste aus. Es gibt dann eine Liste zurück. Konvertiere die Liste zurück in einen Datenrahmen.

Im folgenden Beispiel werden numerische Häufigkeiten zu einer kategorialen Variablen neu codiert. Es ist schnell und erhöht nicht die Speichernutzung.

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