3

我有一个 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

我调查了这个问题,并没有找到任何与我的问题完全匹配的答案。这些答案集中在“popen”子例程上,但我不使用这个例程。我只是使用“ commands.getoutput()”来显示文档的文件类型。

需要注意的是,如果我尝试处理 1000 万行文本,则不会出现此问题。仅当文本文件很大时才会发生。任何人都可以在这个问题上帮助我吗?答案可能是比“ command.getoutput()”更好的模块。谢谢!

4

1 回答 1

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
    
于 2012-08-15T19:28:37.873 回答