将大输出转储到变量

时间:2013-12-15 13:14:39

标签: python variables memory-management python-2.4

我正在使用subprocess运行Unix进程然后捕获输出。像这样:

command_process = subprocess.Popen(
    [command],
    shell=True,
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    stderr=subprocess.STDOUT,
)

command_output = command_process.communicate()[0]

log_file = open('command.log', 'a')
log_file.write(command_output)
log_file.write('\n')
log_file.close()

我将进程的输出保存到变量command_output,该变量将被转储到command.log文件中。

  • python如何在变量中存储数据?
    • 它们是在内存缓冲区中,还是写入磁盘的变量值?
  • 如果输出非常大,这样做有风险吗?
  • 什么是更安全的替代品?

1 个答案:

答案 0 :(得分:1)

  
      
  • 是内存缓冲区中的变量,还是写入磁盘的变量值?
  •   

变量位于内存缓冲区中。你可以通过运行(如果你只有一个正在运行的python进程)来看到这个(在Linux上)

pidof python | awk '{print "lsof -a -p "$1}' | bash

示例输出:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
python  19858 jazzpi  cwd    DIR    8,1    12288 135854 /home/jazzpi
python  19858 jazzpi  rtd    DIR    8,1     4096      2 /
python  19858 jazzpi  txt    REG    8,1  2728836 532918 /usr/bin/python2.7
python  19858 jazzpi  mem    REG    8,1   125424     57 /lib/i386-linux-gnu/libtinfo.so.5.9
python  19858 jazzpi  mem    REG    8,1   247008    237 /lib/i386-linux-gnu/libreadline.so.6.2
python  19858 jazzpi  mem    REG    8,1    21648 131133 /usr/lib/python2.7/lib-dynload/readline.so
python  19858 jazzpi  mem    REG    8,1  2965552 530650 /usr/lib/locale/locale-archive
python  19858 jazzpi  mem    REG    8,1   114788     13 /lib/i386-linux-gnu/libgcc_s.so.1
python  19858 jazzpi  mem    REG    8,1  1437864   4337 /lib/i386-linux-gnu/i686/cmov/libc-2.13.so
python  19858 jazzpi  mem    REG    8,1   148996   4334 /lib/i386-linux-gnu/i686/cmov/libm-2.13.so
python  19858 jazzpi  mem    REG    8,1    95896    129 /lib/i386-linux-gnu/libz.so.1.2.7
python  19858 jazzpi  mem    REG    8,1     9800   4326 /lib/i386-linux-gnu/i686/cmov/libutil-2.13.so
python  19858 jazzpi  mem    REG    8,1     9844   4330 /lib/i386-linux-gnu/i686/cmov/libdl-2.13.so
python  19858 jazzpi  mem    REG    8,1   117009   4327 /lib/i386-linux-gnu/i686/cmov/libpthread-2.13.so
python  19858 jazzpi  mem    REG    8,1    26064 523330 /usr/lib/i386-linux-gnu/gconv/gconv-modules.cache
python  19858 jazzpi  mem    REG    8,1   117960     35 /lib/i386-linux-gnu/ld-2.13.so
python  19858 jazzpi    0u   CHR  136,3      0t0      6 /dev/pts/3
python  19858 jazzpi    1u   CHR  136,3      0t0      6 /dev/pts/3
python  19858 jazzpi    2u   CHR  136,3      0t0      6 /dev/pts/3

您可以看到它没有打开任何要写入的文件。另外,来自标签variable的StackOverflow描述:

  

变量是内存中命名的数据存储位置

但是,当您的计算机内存不足时,它可以将RAM的内容写入磁盘(即Windows上的pagefile.sys,Linux上的交换分区)。当您将操作系统发送到休眠模式时,通常也会发生这种情况。

  
      
  • 如果输出非常大,这样做有风险吗?
  •   

写入交换是操作系统的最后手段,你应该尽量避免,因为从磁盘读取比从RAM读取要慢很多(另见Teach yourself programming in 10 years)。

  
      
  • 什么是更安全的替代品?
  •   

因此,如果您正在处理大到足以可能溢出PC内存的巨大输出,则应考虑定期将该数据转储到磁盘上的临时文件中(例如,每10MB左右),如果可能的话。

如果您想从输出流中读取,我还建议您查看this