2012-01-11 6 views
39

rm(list=ls())을 호출하여 R의 메모리를 주기적으로 청소하고 있습니다.
이후 가비지 컬렉터 gc()에 연락해야합니까?gc()와 rm()의 차이점

이 두 함수의 차이점은 무엇입니까? gc() 특정 변수에 대해 rm()을 호출합니까?

답변

57

첫째, 여부 (두 단지 더 이상 액세스 할 수 없습니다 것들에 대한 메모리를 해제 당신은 여전히 ​​일 아민된다 어떤 변수를 삭제하지 않는 gc 매우 다르다는 것을 주목하는 것이 중요하다 rm()을 사용하여 제거되거나, 이후에 반환 된 함수에서 생성 됨). gc()을 실행하면 결코 변수를 잃지 않습니다.

을 호출해야하는지에 대한 질문은 rm()을 호출 한 후에 좋은 방법입니다. gc에 대한 documentation은 유용하게 메모합니다.

가비지 수집이 발생합니다. 이것은 사용자 개입 없이도 자동으로 이루어지며 gc를 호출하는 주된 목적은 메모리 사용량에 대한 보고서입니다.

그러나 큰 개체를 제거한 후에 gc를 호출하면 R이 운영 체제에 메모리를 반환하도록 요청할 수 있으므로 유용 할 수 있습니다.

그래서 답은이 가능성 (곧 다음하지 즉시 경우) 어쨌든 트리거 될 것이라고하더라도, (그리고 적어도, 다치게 할 수 없어) gc()를 호출하는 것이 좋을 수 있다는 것입니다.

+0

답장을 보내 주셔서 감사합니다. 일반적으로 R 자동 가비지 수집은 좋은 것으로 간주됩니까? (예를 들어 java처럼 강력한 것) – RockScience

+0

대답하기 어려운 질문입니다. 확실하지 않습니다. [이 질문] (http://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command) 유용합니다. –

+5

일반적으로 gc를 호출 할 필요는 없습니다. 그렇게하면 gc를 많이 변경하지는 않습니다. – hadley

-1

개인적으로 루프가 사용 가능한 공간을 채우기 시작할 때 일부 RAM을 비우기 위해 루프에 gc()을 포함하고 싶습니다. 예 :

for(i in 1:1000){ 
res[[i]] = some operation 
gc() 
} 
+5

gc()를 호출하는 것은 호출 당 100ms 정도의 상당한 성능 저하가 있음을 알고 있어야합니다. 따라서이 경우 코드는 필요한 것보다 약 100 초 더 오래 실행됩니다. – ThankGoat