我有一个在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()
”之外的更好的模块。谢谢!
答案 0 :(得分: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