2014-06-30 5 views
0

나는 외부 명령의 lot을 호출하여 많은 데이터를로드해야하는 파이썬 스크립트를 가지고있다. 몇 시간 후 이 항상 함께 충돌 : 기계 스크립트보다 가능한 더 많은 메모리가 없더라도메모리 효율적인 Python에서 외부 명령 호출

.... 
process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, close_fds=True) 
File "/usr/lib/python2.6/subprocess.py", line 621, in __init__ 
errread, errwrite) 
File "/usr/lib/python2.6/subprocess.py", line 1037, in _execute_child 
self.pid = os.fork() 
OSError: [Errno 12] Not enough space 
abort: Not enough space 

이 ... 실제로 사용하고 있습니다.

근본 원인은 모든 포크() 실제로 즉시) (간부의 호출에 의해 해제 부모 프로세스에 비해 두 배 많은 메모리를 요구하는 것 같다 (참조 : http://www.oracle.com/technetwork/server-storage/solaris10/subprocess-136439.html) 을 ... 내 경우 위에게의 여러 스레드에서 데이터를로드하고 있기 때문에 더 나쁩니다.

이 문제를 해결하는 방법에 창의적인 방법이 있습니까?

답변

-1

외부 명령을 실행하거나 실행중인 명령을 실행해야합니까?

당신은 또 다른 스크립트 시도 실행해야하는 경우 사용량에 따라 불필요 할 수도

subprocess.call() 

subprocess.call(["ls", "-l"]) 

os.fork 복사 현재 환경을.

서브 프로세스 모듈을 사용하기 전에 가져 오는 것을 잊지 마십시오.

더 많은 정보는 :

+0

subprocess.call()를 사용의 문제는 os.fork() (다음을 사용하여 사실 때문이다 os.execvp()에 의해), syscall fork()를 호출합니다. Solaris (및 memmory overcommitment가 활성화되지 않은 다른 U * IX 시스템)의 syscall fork()는 실제로 프로세스를 할당 한 모든 memmory 영역을 포함하여 프로세스를 "복제"합니다 (다음 syscall execvp()가 실제로 대부분을 릴리스하는 반면 한동안). 따라서 시스템의 memmory가 1/2 이상 할당 된 프로세스가있는 경우 syscall fork()가 실패합니다. 하위 프로세스가 아무리 작은 경우에도 ---( – pez