2012-10-20 3 views
2

GAE에서 내 처리기가 모든 과중한 작업을 수행합니다. 모든 오브젝트는 함수 내에서 작성됩니다. 그러나 함수가 끝나면 (response.out.write에 대한 문자열을 반환합니다) 메모리 사용량이 감소하지 않습니다. GAE에 대한 첫 번째 http 호출이 작동하지만 나중에 메모리는 약 100MB로 유지됩니다. 개인 메모리 한계에 도달 했으므로 두 번째 액세스 시도가 실패합니다.함수가 반환 된 후 메모리가 해제되지 않는 이유는 무엇입니까?

필자가 작성한 모든 클래스 정적 개체를 지우고 제 3 자 라이브러리의 닫기 및 지우기 기능을 사용하지 마십시오. 어떻게 메모리를 깨끗하게 해제 할 수 있습니까? 차라리 메모리 누수를 추적하는 것보다 강제로 재시작하는 것이 좋습니다. 성능은 여기서 문제가되지 않습니다.

나는 그것이 GC 때문이 아니라는 것을 알고있다. GAE는 장기간 높은 수준의 기억력을 유지한다고보고합니다. 위의 두 가지 http 호출은 분 이상 분리되었습니다.

Handler.get 함수에서 내 함수 가져 오기를 시도했습니다. 페이지를 제공 한 후 모든 가져온 제 3 자 모듈을 삭제 한 다음 내 모듈을 삭제하려고했습니다. 이론 상으로는 각 호출이 모든 의심되는 모듈을 다시 시작해야하지만 메모리 문제는 여전히 지속됩니다. 호출간에 남아있는 유일한 (의도 된) 모듈은 표준 라이브러리 모듈 (lxml, xml 등)이어야합니다.

EDIT : 이제는 작업 대기열을 사용하여 백엔드 인스턴스에서 헤비 듀티 파트를 예약하고 db.Blob을 사용하여 결과를 전달합니다. 백엔드를 작동 시키면 메모리 문제가 해결됩니다. 백엔드에 대한 GAE 문서는 완전하지만 혼란 스럽습니다. 핵심은 1) 백엔드 편집 .yaml 2) appcfg를 사용하여 업데이트 (시작 프로그램에서 배포하는 것만으로는 충분하지 않음)에 대한 지침을 따라야한다는 것입니다. 나중에 백엔드가 작동하는지 관리자에게 확인하십시오. 또한 taskqueue target = 개발 서버에서 중단되므로 개발 서버에서 해결해야합니다.

답변

2

가비지 컬렉터 (사용하지 않는 메모리를 비우는 책임을지고 있음)이 함수가 반환 될 때 직접적으로 시작된다는 사실이 아무 것도 없다는 사실이 원인 일 가능성이 큽니다.

수동으로 몇 번의 해킹을 통해 강제로 시작할 수 있지만 두 번의 http 요청이 발생하면 해결되지 않습니다. 동시에.

대신 각 요청에 과도한 작업을 수행 할 필요가없는 솔루션을 살펴 보는 것이 좋습니다.

생성 된 데이터가 각 요청마다 고유하면 (제한된) 개인용 메모리 풀 외부에서 계산을 수행 할 수 있는지 확인하십시오.


수동으로 가비지 수집기를 시작하려면 어떻게합니까?

중량 변수가 범위를 벗어 났을 때 아래의 방법을 사용하여 GC를 호출하십시오.

import gc 

... 

gc.collect() 
관련 문제