Domanda

Ho 12 data.frames con cui lavorare. Essi sono simili e devo fare lo stesso trattamento a ciascuno, così ho scritto una funzione che prende un data.frame, elabora, e poi restituisce un data.frame. Questo funziona. Ma temo che sto passando in giro una grande struttura. I può essere l'esecuzione di copie temporanee (sono?) Questo non può essere efficiente. Qual è il modo migliore per evitare il superamento di un data.frame intorno?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}
È stato utile?

Soluzione

Si sono, infatti, passando l'oggetto intorno e con po 'di memoria. Ma non credo che si può fare un'operazione su un oggetto in R senza passare l'oggetto attorno. Anche se non avete creato una funzione e ha fatto le operazioni al di fuori della funzione, R si comporterebbe fondamentalmente la stessa.

Il modo migliore per vedere questo è quello di istituire un esempio. Se si è in Windows aprire Windows Task Manager. Se siete in Linux aprire una finestra di terminale ed eseguire il comando top. Ho intenzione di assumere di Windows in questo esempio. In R eseguire il seguente:

col1<-rnorm(1000000,0,1)
col2<-rnorm(1000000,1,2)
myframe<-data.frame(col1,col2)

rm(col1)
rm(col2)
gc()

questo crea un paio di vettori chiamati col1 e col2 poi li combina in un frame di dati chiamato MyFrame. Si scende poi l'vettori e forze garbage collection per l'esecuzione. Guarda nel tuo Windows task manager in Utilizzo memoria per l'attività Rgui.exe. Quando inizio R che utilizza circa 19 mega di mem. Dopo che ho eseguire i comandi sopra la mia macchina utilizza poco meno di 35 mega per R.

Ora provate questo:

myframe<-myframe+1

l'uso della memoria per R dovrebbe saltare a più di 144 mega. Se si forza la raccolta dei rifiuti mediante GC () si vedrà cadere di nuovo a circa il 35 meg. Per provare questo utilizzando una funzione, è possibile effettuare le seguenti operazioni:

doSomething <- function(df) {
    df<-df+1-1
return(df)
}
myframe<-doSomething(myframe)

quando si esegue il codice di cui sopra, l'utilizzo di memoria salterà fino a 160 mega o giù di lì. gc esecuzione () scenderà di nuovo a 35 mega.

Quindi, cosa fare di tutto questo? Beh, fare un'operazione al di fuori di una funzione che non è molto più efficiente (in termini di memoria) che farlo in una funzione. raccolta dei rifiuti pulisce le cose davvero bello. In caso di forzare gc () per l'esecuzione? Probabilmente non come verrà eseguito automaticamente, se necessario, ho appena eseguito sopra per mostrare come l'utilizzo della memoria impatti.

Mi auguro che aiuta!

Altri suggerimenti

Non sono un esperto R, ma maggior parte delle lingue uso un sistema di conteggio delle di riferimento per i grandi oggetti. Una copia dei dati oggetto non sarà effettuato fino a quando si modifica la copia dell'oggetto. Se le funzioni di sola lettura dei dati (vale a dire per l'analisi), allora nessuna copia dovrebbe essere fatta.

mi sono imbattuto in questa domanda cerca di qualcosa di diverso, ed è vecchio - quindi mi limiterò a fornire una breve risposta per ora (lasciare un commento se vuoi ulteriori spiegazioni)

.

È possibile passare in giro ambienti in R che contengono ovunque da 1 a tutte le variabili. Ma probabilmente non c'è bisogno di preoccuparsi.

[Si potrebbe anche essere in grado di fare qualcosa di simile con le classi. Ho solo momento di capire come utilizzare le classi per le funzioni polimorfiche -. E nota c'è più di 1 sistema di classe calci in giro]

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top