commands.getoutput()引发Errno 12 - 无法分配内存

时间:2012-08-15 19:05:55

标签: python

我有一个在RHEL5服务器上运行的Python脚本。该服务器具有32GB内存和8个Intel Xeon CPU,频率为2.83GHz。我认为硬件资源不应该是一个问题,但当我尝试上传和处理一个1500万行文本文件时,该程序给我一个错误信息:

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()”之外的更好的模块。谢谢!

1 个答案:

答案 0 :(得分: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