Python commands.getoutput()引发错误12-无法分配内存

Python commands.getoutput()引发错误12-无法分配内存,python,Python,我有一个Python脚本,它运行在带有RHEL5的服务器上。该服务器有32GB内存和8个2.83GHz的Intel Xeon CPU。我认为硬件资源应该不是问题,但当我尝试上载和处理1500万行文本文件时,程序会给我一条错误消息: Traceback (most recent call last): File "./test.py", line 511, in <module> startup() File "./test.py", line 249, in star

我有一个Python脚本,它运行在带有RHEL5的服务器上。该服务器有32GB内存和8个2.83GHz的Intel Xeon CPU。我认为硬件资源应该不是问题,但当我尝试上载和处理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
回溯(最近一次呼叫最后一次):
文件“/test.py”,第511行,在
启动()
文件“/test.py”,第249行,在启动中
cmdoutput=commands.getoutput(cmd\u文件)
文件“/usr/local/lib/python2.6/commands.py”,第46行,在getoutput中
返回getstatusoutput(cmd)[1]
文件“/usr/local/lib/python2.6/commands.py”,第55行,在getstatusoutput中
pipe=os.popen('{'+cmd+';}2>&1',r')
OSError:[Errno 12]无法分配内存
我调查了这个问题,没有找到任何与我的问题完全匹配的答案。这些答案集中在“popen”子例程上,但我不使用这个例程。我只是使用“
命令.getoutput()
”来显示文档的文件类型

应该注意的是,如果我试图处理一个1000万行的文本,这个问题就不会发生。它只在文本文件较大时发生。 有人能帮我解决这个问题吗?答案可能是一个更好的模块,而不是“
command.getoutput()
”模块。谢谢

  • 您的命令可能会占用太多内存。要进行检查,请在不使用python的控制台中使用大文件运行它,以查看是否有任何错误
  • 您的命令可能会生成过多的输出。要检查,请运行:

    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
    

  • 尝试查看subprocess.Popen。我不确定,但我认为您的问题与commands.getoutput试图将所有输出保存在内存中并立即返回有关。避免这种方法。该命令对文件有什么作用?它是否将所有数据读入内存并执行一些本地操作?它是否向控制台输出了一整串数据,而您的脚本将读取大量数据?再看看回溯,您实际上隐式使用了os.popen(getoutput()调用它),您可以使用
    ulimit-a
    来检查当前的每进程内存限制是否符合您的预期。@iamcuckb:我认为这不是问题所在。32位python进程可能是2GB,而64位python进程显然更高。我认为阿吉特·乔治对管道尺寸的猜测最接近