2010-02-22 5 views
45

가끔은 실행하기 전에 얼마나 많은 메모리를 사용할지를 결정하기가 어려운 Python 프로그램을 작성합니다. 따라서, 나는 때때로 대량의 RAM을 할당하려고 시도하는 파이썬 프로그램을 호출하여 커널이 다른 실행중인 프로세스의 성능을 크게 바꿔서 성능을 저하시킵니다.힙 크기를 제한하는 방법은 무엇입니까?

이 때문에 파이썬 힙이 얼마나 많은 메모리를 차지할 수 있는지 제한하고 싶습니다. 한도에 도달하면 프로그램이 중단 될 수 있습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?

중요한 경우 많은 코드가 Cython에 작성되어 있으므로 할당 된 메모리를 고려해야합니다. 필자는 순수한 Python 솔루션 (휴대용이 필요 없음)과 결혼하지 않았으므로 Linux에서 작동하는 모든 것이 좋습니다.

+4

이 질문에 대해 혼란스러워합니다. 그것은 대답을 포함하는 것으로 보이지만 잘못 된 것을 나타내지는 않습니다. – amcnabb

+0

수락 된 답변의 코드를 자신의 질문에 복사 한 것처럼 보입니다. 아마도 그것은 해결책일까요? – fantabolous

+0

@amcnabb 질문에서 대답을 제거했습니다 – Djizeus

답변

45

체크 아웃 resource.setrlimit()을 확인하십시오. Unix 시스템에서만 작동하지만 리소스와 .RLIMIT_DATA 매개 변수를 사용하여 프로세스의 최대 힙 크기와 프로세스의 하위를 선택할 수 있기 때문에 원하는 것 같아 보입니다.

편집 : 예를 들어 추가 :

import resource 

rsrc = resource.RLIMIT_DATA 
soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit starts as :', soft 

resource.setrlimit(rsrc, (1024, hard)) #limit to one kilobyte 

soft, hard = resource.getrlimit(rsrc) 
print 'Soft limit changed to :', soft 

내가 사용 사례가 정확히 무엇인지 확실하지 않다 그러나 당신이 대신 resouce.RLIMIT_STACK와 스택의 크기에 제한을 배치해야 가능합니다. 이 제한을 초과하면 프로세스에 SIGSEGV 신호를 보내고이를 처리하려면 setrlimit Linux manpage에 설명 된대로 대체 신호 스택을 사용해야합니다. sigaltstack이 파이썬으로 구현되었는지 확신 할 수 없으므로,이 경계를 넘어 서지 않고 복구하려는 경우 어려울 수 있습니다.

+3

예제를 줄 수 있습니까? 다양한 리소스 rlimits를 설정하려고했지만 여전히 기가비트 목록을 할당 할 수있었습니다. 리소스 모듈은 "옳은 느낌"이지만 리눅스에서 작동하도록 할 수는 없습니다. – carl

+0

질문에 나의 테스트를 추가했습니다. 내 이해는 한도에 도달하면 파이썬 프로그램을 종료해야한다는 것입니다. – carl

+2

또한 한계에 도달하면 어떻게 될지 신경 쓰지 않습니다. 프로그램이 더 많은 메모리를 할당하지 않는 한 충돌하거나 멈출 수 있습니다. – carl

0

ulimit을 살펴보십시오. 자원 할당량을 설정할 수 있습니다. 적절한 커널 설정이 필요할 수도 있습니다.

+0

어쨌든 PAM을 사용하는 경우'/ etc/security/limits.conf'가 제한을 설정하기에 더 좋습니다. 'ulimit'은 Bash 쉘 함수입니다. –

+0

ulimit는 파이썬 리소스 모듈과 동일한 시스템 호출을 사용합니다 – Willem

관련 문제