Qual é a melhor maneira de evitar a passagem de um quadro de dados ao redor?

votos
12

Eu tenho 12 data.frames para trabalhar. Eles são semelhantes e eu tenho que fazer o mesmo processamento para cada um, então eu escrevi uma função que leva um data.frame, processa e, em seguida, retorna um data.frame. Isso funciona. Mas eu tenho medo que eu estou passando em torno de uma grande estrutura. I pode estar fazendo cópias temporárias (sou eu?) Isso não pode ser eficiente. Qual é a melhor maneira de evitar a passagem de um data.frameao redor?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}
Publicado 27/02/2009 em 20:49
fonte usuário
Em outras línguas...                            


3 respostas

votos
11

Você está, de fato, passando o objeto ao redor e usando um pouco de memória. Mas eu não acho que você pode fazer uma operação em um objeto em R sem passar o objeto ao redor. Mesmo se você não criar uma função e fez suas operações fora da função, R iria se comportar basicamente o mesmo.

A melhor maneira de ver isso é a criação de um exemplo. Se você está em aberto Windows Task Manager do Windows. Se você estiver em Linux abrir uma janela de terminal e execute o comando superior. Eu estou indo supor que o Windows neste exemplo. Em R execute o seguinte:

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

rm(col1)
rm(col2)
gc()

isso cria um par de vetores chamados col1 e col2, em seguida, combina-las em um quadro de dados chamado MyFrame. Em seguida, cai a vetores e as forças de coleta de lixo para ser executado. Assistir no seu janelas gerenciador de tarefas no uso mem para a tarefa Rgui.exe. Quando eu começar R ele usa cerca de 19 meg de mem. Depois que eu execute os comandos acima minha máquina está usando um pouco menos de 35 meg para R.

Agora tente o seguinte:

myframe<-myframe+1

seu uso de memória para R deve saltar para mais de 144 meg. Se você forçar a coleta de lixo usando gc (), você vai vê-lo cair de volta para cerca de 35 meg. Para tentar isso usando uma função, você pode fazer o seguinte:

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

quando você executar o código acima, o uso de memória irá saltar até 160 meg ou assim. Correndo gc () vai cair de volta para 35 meg.

Então, o que fazer com tudo isso? Bem, fazendo uma operação fora de uma função que não é muito mais eficiente (em termos de memória) do que fazê-lo em uma função. A coleta de lixo limpa as coisas muito legal. Se você forçar gc () para executar? Provavelmente não como ele será executado automaticamente quando necessário, eu só correu acima para mostrar como o uso de memória impactos.

Espero que ajude!

Respondeu 04/03/2009 em 20:28
fonte usuário

votos
9

Não sou especialista R, mas a maioria dos idiomas utilizam um esquema de contagem de referência para grandes objetos. A cópia dos dados objeto não será feita até que você modifique a cópia do objeto. Se suas funções só ler os dados (ou seja, para análise), então nenhuma cópia deve ser feita.

Respondeu 04/03/2009 em 20:41
fonte usuário

votos
1

Me deparei com esta questão procurando outra coisa, e ele é velho - por isso vou dar uma breve resposta por agora (deixar um comentário se você gostaria de mais explicação).

Você pode passar em torno de ambientes em R que contêm qualquer lugar de 1 a todos os seus variáveis. Mas, provavelmente, você não precisa se preocupar com isso.

[Você pode também ser capaz de fazer algo semelhante com classes. Eu só momento entender como usar classes para funções polimórficas - e note que não é mais do que um sistema de classes chutando em torno].

Respondeu 01/05/2013 em 18:34
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more