【问题标题】:Dump large output to variable [duplicate]将大输出转储到变量[重复]
【发布时间】:2013-12-15 13:14:38
【问题描述】:

我正在使用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如何在变量中存储数据?
    • 它们是在内存缓冲区中,还是将变量值写入磁盘?
  • 如果输出非常大,这样做有风险吗?
  • 有哪些更安全的替代品?

【问题讨论】:

标签: python variables memory-management python-2.4


【解决方案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 的 RAM 溢出,您应该考虑在可能的情况下定期(例如每 10MB 左右)将该数据转储到磁盘上的临时文件中。

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

【讨论】:

猜你喜欢
  • 2019-11-05
  • 2017-06-13
  • 2013-09-09
  • 2015-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2018-01-27
相关资源
最近更新 更多