RHEL5가있는 서버에서 실행되는 Python 스크립트가 있습니다. 이 서버는 2.83GHz에서 32GB 메모리와 8 개의 Intel Xeon CPU를 갖추고 있습니다. 나는 하드웨어 리소스가 문제가되지 않습니다 생각하지만, 내가 업로드를 시도하고 1,500 만 줄의 텍스트 파일을 처리 할 때, 프로그램은 나에게 오류 메시지가 있습니다 :이 문제를 조사하고 발견되지 않았다commands.getoutput()은 Errno를 발생시킵니다 12 - 메모리를 할당 할 수 없습니다
Traceback (most recent call last):
File "./test.py", line 511, in <module>
startup()
File "./test.py", line 249, in startup
cmdoutput = commands.getoutput(cmd_file)
File "/usr/local/lib/python2.6/commands.py", line 46, in getoutput
return getstatusoutput(cmd)[1]
File "/usr/local/lib/python2.6/commands.py", line 55, in getstatusoutput
pipe = os.popen('{ ' + cmd + '; } 2>&1', 'r')
OSError: [Errno 12] Cannot allocate memory
을 내 문제와 정확히 일치하는 모든 대답. 그 대답은 "popen"서브 루틴에 초점을 맞추었지만이 루틴을 사용하지 않습니다. "commands.getoutput()
"을 사용하여 문서의 파일 형식을 표시하기 만하면됩니다.
1000 만 줄 텍스트를 처리하려고하면이 문제가 발생하지 않습니다. 텍스트 파일이 클 경우에만 발생합니다. 어떤 사람들이이 문제에 관해 나를 도와 줄 수 있습니까? 대답은 "command.getoutput()
"이외의 더 나은 모듈 일 수 있습니다. 감사!
하는 subprocess.Popen보고보십시오. 확실하지는 않지만 문제는 commands.getoutput이 모든 출력을 메모리에 저장하고 즉시 반환하려고한다는 사실과 관련 있다고 생각합니다. 그 접근법을 피하십시오. – user37078
명령은 파일에서 무엇을합니까? 그것을 메모리에 모두 읽고 로컬 작업을 수행합니까? 그것은 당신의 스크립트가 많은 양의 데이터를 읽는 콘솔에 전체 묶음을 출력합니까? – jdi
추적을 다시 보면, 실제로는 os.popen을 암시 적으로 사용합니다 (getoutput()이 호출합니다). –