나는 외부 명령의 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) 을 ... 내 경우 위에게의 여러 스레드에서 데이터를로드하고 있기 때문에 더 나쁩니다.
이 문제를 해결하는 방법에 창의적인 방법이 있습니까?
subprocess.call()를 사용의 문제는 os.fork() (다음을 사용하여 사실 때문이다 os.execvp()에 의해), syscall fork()를 호출합니다. Solaris (및 memmory overcommitment가 활성화되지 않은 다른 U * IX 시스템)의 syscall fork()는 실제로 프로세스를 할당 한 모든 memmory 영역을 포함하여 프로세스를 "복제"합니다 (다음 syscall execvp()가 실제로 대부분을 릴리스하는 반면 한동안). 따라서 시스템의 memmory가 1/2 이상 할당 된 프로세스가있는 경우 syscall fork()가 실패합니다. 하위 프로세스가 아무리 작은 경우에도 ---( – pez