UFO ET IT

gc () 명령을 사용하여 R에서 가비지 수집을 강제 실행

ufoet 2020. 11. 21. 08:37
반응형

gc () 명령을 사용하여 R에서 가비지 수집을 강제 실행


주기적으로 나는 엉성하게 프로그램한다. 좋아, 나는 항상 엉성하게 프로그래밍하지만 때로는 메모리 부족 오류의 형태로 나를 따라 잡는다. rm()명령으로 객체를 삭제하는 데 약간의 훈련을 시작하면 상황이 좋아집니다. gc()대용량 데이터 개체를 삭제 한 후 명시 적으로 호출해야하는지 여부에 대한 혼합 메시지가 온라인에서 표시 됩니다. 어떤 사람들은 R이 메모리 오류를 반환하기 전에 실행될 gc()것이라고 말하고 다른 사람들은 수동으로 강제 gc하는 것이 좋은 생각 이라고 말합니다 .

gc()최대 메모리 가용성을 보장하기 위해 큰 개체를 삭제 한 후 실행해야합니까 ?


"아마." 나도하고, 종종 루프에서

cleanMem <- function(n=10) { for (i in 1:n) gc() }

그러나 그것은 내 경험상 기억을 원시 상태로 복원하지 않습니다.

그래서 제가 일반적으로하는 일은 스크립트 파일에 작업을 보관하고 'r'프런트 엔드 (Unix에서, 'littler'패키지)를 사용하여 작업을 실행하는 것입니다. Rscript는 다른 OS의 대안입니다.

그 워크 플로는

이전에 여기서 다루었습니다.


의 도움말 페이지에서 gc:

'gc'를 호출하면 가비지 콜렉션이 발생합니다. 이것은 또한 사용자 개입없이 자동으로 수행되며 'gc'를 호출하는 주요 목적은 메모리 사용량에 대한 보고서입니다.

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

그렇게 할 수 수행하는 것이 유용 할 수 있지만, 대부분은 당신이 필요가 없습니다. 내 개인적인 의견은 이것이 최후의 수단의 코드 gc()라는 것입니다. 당연히 문장으로 코드를 흩 뿌려서는 안되지만 기계가 계속 넘어지고 다른 모든 것을 시도했다면 도움이 될 수 있습니다.

다른 모든 것은 다음과 같은 것을 의미합니다.

  1. 원시 스크립트가 아닌 함수를 작성하므로 변수가 범위를 벗어납니다.

  2. 한 문제에서 관련없는 다른 문제로 이동할 경우 작업 공간을 비 웁니다.

  3. 관심이없는 데이터 / 변수를 버리십시오. (저는 수십 개의 관심없는 열이있는 스프레드 시트를 자주받습니다.)


R은 RAM 만 사용합니다. Mac에서는 그렇지 않습니다 (Windows에서도 마찬가지입니다.) RAM이 부족하면 가상 메모리를 사용하기 시작합니다. 항상은 아니지만 때때로 프로세스는 gc ()를 실행하고 메모리를 확보해야한다는 것을 '인식'합니다. 그렇게하지 않으면 ActivityMonitor.app을 사용하여 모든 RAM이 점유되고 디스크 액세스가 급증했음을 확인할 수 있습니다. 큰 Cox 회귀 실행을 수행 할 때 다음 호출을 선행하여 가상 메모리 (느린 디스크 액세스 사용)로 넘쳐나는 것을 방지 할 수 있습니다.gc(); cph(...)


파티에 조금 늦었지만 :

명시 적으로 호출 gc하면 "지금"일부 메모리가 해제됩니다. ... 다른 프로세스 에 메모리가 필요한 경우 좋은 생각 일 수 있습니다. 예를 들어 전화하기 전에 system또는 이와 유사합니다. 또는 스크립트를 "완료"하고 R은 다음 작업이 도착할 때까지 잠시 유휴 상태로 유지되어 다른 프로세스 가 더 많은 메모리를 얻습니다.

스크립트가 더 빨리 실행되기를 원한다면 R이 필요할 때 나중에 호출 할 것이기 때문에 중요하지 않습니다. 정상적인 GC주기가이를 호출 할 필요가 없었을 수 있기 때문에 더 느릴 수도 있습니다.

... 그러나 예를 들어 시간을 측정하려면 일반적으로 테스트를 실행하기 전에 GC를 수행하는 것이 좋습니다. 이것이 system.time기본적으로 수행되는 작업입니다.

업데이트 @DWin이 지적했듯이 R (또는 C # 또는 Java 등)은 메모리가 부족하고 GC를 실행해야하는시기를 항상 알 수는 없습니다. 따라서 때때로 메모리 시스템의 결함에 대한 해결 방법으로 GC를 수행해야 할 수 있습니다.


아니요. 작업에 사용할 수있는 메모리가 충분하지 않으면 R이 gc()자동으로 실행 됩니다.


"아마도." 나는 정말로 확실한 대답이 없습니다. 그러나 도움말 파일에 따르면 gc ()를 호출하는 데는 두 가지 이유 만 있습니다.

  1. 메모리 사용량에 대한 보고서를 원합니다.
  2. 큰 개체를 제거한 후 "운영 체제에 메모리를 반환하라는 메시지가 R에 표시 될 수 있습니다."

반복되는 호출로 큰 시뮬레이션 속도를 늦출 수 있기 때문에 큰 것을 제거한 후에 만 ​​수행하는 경향이 있습니다. 즉, 타당한 이유가없는 한 항상 체계적으로 부르는 것은 말이되지 않는다고 생각합니다.

참고 URL : https://stackoverflow.com/questions/1467201/forcing-garbage-collection-to-run-in-r-with-the-gc-command

반응형