데이터 프레임을 전달하지 않는 가장 좋은 방법은 무엇입니까?

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

  •  09-09-2019
  •  | 
  •  

문제

나는 12가있다 data.frames와 함께 일할 수 있습니다. 그것들은 비슷하고 각 처리를 수행해야하므로 나는 data.frame, 그것을 처리 한 다음 a data.frame. 이것은 작동합니다. 그러나 나는 매우 큰 구조를 지나가는 것을 두려워합니다. 임시 사본을 만들 수 있습니다 (나?) 이것은 효율적 일 수 없습니다. 통과를 피하는 가장 좋은 방법은 무엇입니까? data.frame 주위에?

doSomething <- function(df) {
  // do something with the data frame, df
  return(df)
}
도움이 되었습니까?

해결책

당신은 실제로 물체를 전달하고 기억을 사용하고 있습니다. 그러나 나는 당신이 물체를 지나치지 않고 R의 객체에서 작업을 수행 할 수 있다고 생각하지 않습니다. 함수를 만들지 않고 기능 외부에서 작업을 수행하더라도 R은 기본적으로 동일하게 행동합니다.

이것을 보는 가장 좋은 방법은 예를 설정하는 것입니다. Windows에있는 경우 Open Windows 작업 관리자입니다. Linux에있는 경우 터미널 창을 열고 상단 명령을 실행하십시오. 이 예에서는 Windows를 가정하겠습니다. r에서 다음을 실행합니다.

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

rm(col1)
rm(col2)
gc()

이것은 col1 및 col2라는 몇 개의 벡터를 생성 한 다음 myframe이라는 데이터 프레임으로 결합합니다. 그런 다음 벡터를 떨어 뜨리고 쓰레기 수집이 실행되도록합니다. RGUI.EXE 작업의 MEM 사용에서 Windows 작업 관리자를 살펴보십시오. 내가 시작하면 약 19 meg의 mem을 사용합니다. 위의 명령을 실행 한 후 내 컴퓨터는 R에 대해 35 Meg 미만을 사용하고 있습니다.

이제 이것을 시도하십시오 :

myframe<-myframe+1

R에 대한 메모리 사용량은 144 Meg 이상으로 이동해야합니다. GC ()를 사용하여 쓰레기 수집을 강제하면 약 35 Meg로 떨어질 것입니다. 함수를 사용하여 이것을 시도하려면 다음을 수행 할 수 있습니다.

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

위의 코드를 실행하면 메모리 사용량이 최대 160 메g 정도 증가합니다. GC ()를 실행하면 35 Meg로 다시 떨어집니다.

그래서이 모든 것을 무엇으로 만들어야합니까? 글쎄, 함수 밖에서 작동하는 것이 함수에서 수행하는 것보다 훨씬 더 효율적이지 않습니다 (메모리 측면에서). 쓰레기 수집은 물건을 정말 잘 청소합니다. GC ()가 실행되도록 강요해야합니까? 아마도 필요에 따라 자동으로 실행되지는 않을 것입니다. 나는 그것이 메모리 사용에 어떤 영향을 미치는지 보여주기 위해 위를 달렸습니다.

도움이되기를 바랍니다!

다른 팁

저는 전문가가 아니지만 대부분의 언어는 큰 객체에 대한 참조 계산 체계를 사용합니다. 객체의 사본을 수정할 때까지 객체 데이터의 사본은 작성되지 않습니다. 기능이 데이터 만 읽으면 (즉, 분석을 위해) 사본을 작성해서는 안됩니다.

나는이 질문이 다른 것을 찾는 것을 발견했는데, 그것은 오래되었습니다. 그래서 나는 지금 간단한 대답을 제공 할 것입니다 (더 많은 설명을 원한다면 의견을 남겨주세요).

R의 환경을 통과 할 수 있으며, 모든 변수에서 모든 변수가 포함되어 있습니다. 그러나 아마도 당신은 그것에 대해 걱정할 필요가 없습니다.

수업과 비슷한 일을 할 수도 있습니다. 나는 현재 다형성 기능에 클래스를 사용하는 방법을 이해하고 있으며 1 개 이상의 클래스 시스템이 차고 있다는 점에 유의하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top