Python commands.getoutput()引发错误12-无法分配内存
我有一个Python脚本,它运行在带有RHEL5的服务器上。该服务器有32GB内存和8个2.83GHz的Intel Xeon CPU。我认为硬件资源应该不是问题,但当我尝试上载和处理1500万行文本文件时,程序会给我一条错误消息: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
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()
”模块。谢谢
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进程显然更高。我认为阿吉特·乔治对管道尺寸的猜测最接近