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

StackOverflow https://stackoverflow.com/questions/596819

  •  09-09-2019
  •  | 
  •  

Pergunta

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.frame redor?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}
Foi útil?

Solução

Você é, 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ê estiver no Windows abra o Windows Task Manager. 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 por R.

Agora, tente o seguinte:

myframe<-myframe+1

o uso da 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 um fora de operação 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!

Outras dicas

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.

me deparei com esta questão procurando outra coisa, e ele é velho - por isso vou apenas dar uma resposta breve para 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ó entendem atualmente como usar classes para funções polimórficas -. E nota que há mais de um sistema de classes chutando em torno]

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top