2012-08-15 3 views
2

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()"이외의 더 나은 모듈 일 수 있습니다. 감사!

+2

하는 subprocess.Popen보고보십시오. 확실하지는 않지만 문제는 commands.getoutput이 모든 출력을 메모리에 저장하고 즉시 반환하려고한다는 사실과 관련 있다고 생각합니다. 그 접근법을 피하십시오. – user37078

+0

명령은 파일에서 무엇을합니까? 그것을 메모리에 모두 읽고 로컬 작업을 수행합니까? 그것은 당신의 스크립트가 많은 양의 데이터를 읽는 콘솔에 전체 묶음을 출력합니까? – jdi

+1

추적을 다시 보면, 실제로는 os.popen을 암시 적으로 사용합니다 (getoutput()이 호출합니다). –

답변

2
  1. 명령이 너무 많은 메모리를 소비 할 수 있습니다. 확인하려면 Python을 사용하지 않고 콘솔에서 큰 파일을 실행하여 오류가 있는지 확인하십시오.
  2. 명령이 너무 많은 출력을 생성 할 수 있습니다. 확인하려면 다음을 실행하십시오.

    subprocess.check_call(["cmd", "arg1", "arg2"]) 
    

    성공하면 점진적으로 출력을 읽고 처리 된 출력을 버립니다. 라인별로 라인 :

    p = subprocess.Popen(["cmd", "arg1", "arg2"], stdout=subprocess.PIPE) 
    for line in iter(p.stdout.readline, ''): 
        # do something with line 
        print line, 
    p.stdout.close() 
    exit_code = p.wait() # wait for the process to exit 
    
+0

행복한 큰 5-0! :-) – jdi

관련 문제