首页 > 解决方案 > 为什么系统杀死了我的 python 程序?但是我在 var/log 目录中没有找到任何日志

问题描述

我有一个 python 代码,它是一个迭代程序。循环运行数千次后,被系统杀死。我试图找出它被杀的原因。但我确实发现了任何相关的信息。

终端输出如下:

My own output!
Killed     <---- (This line is the system output. Not included in my code)

我使用了几种方法,例如

dmesg | egrep -i B100 'killed process'

但我仍然找不到任何东西。

我曾经top监控内存使用情况。它只使用了大约 6GB,但我得到了 128GB 内存。

更新:

操作系统版本:Ubuntu 16.04

其他:Python 3.7.6
Tensorflow-GPU 1.15
GPU:TITAN Xp,12GB。
训练神经网络:128、64、两个全连接层
系统内存:128GB。
我的程序使用的内存:大约 6GB。

关于代码中的错误:我在我的macbook pro上运行程序,很好。退出直到完成。

当我运行程序时,除了我之外没有人在使用这台机器。所以它应该被系统而不是其他用户杀死。

更新:当我使用root运行程序时,它不会被杀死。

标签: python

解决方案


您的程序可能请求的内存超出了进度可用的内存。对于 32 位操作系统,理论上一个程序最多只能访问 4 Gb 的内存。

我没有尝试运行消耗超过 4 Gb 内存的 64 位程序。我不确定它是否可以达到 128 Gb 的限制。

要回答为什么它没有日志,即使你没有进行异常处理,是因为它已经耗尽内存,无法创建新对象来打印日志。

如果您可以定期取消引用变量,那么您应该重新查看您的代码,以便 Python 中的垃圾收集可以删除它们,以便您拥有更多内存。

如果您在 Linux 上运行,您可以使用pmap来查看特定进度的内存使用类型。

您可以发布一些示例代码以供其他人帮助。

2020 年 3 月 28 日更新

根据您将使用的底层库,有些可能无法优雅地处理内存分配。您的操作系统通常会终止执行非法操作的进程,例如评估预分配区域之外的内存等。

我已经编写了 2 个脚本来使用 Python 3.7.6 在 Windows 10 Home 下测试巨大的内存分配问题

stress1.py: 使用numpy

import numpy as np

size = 10_000

a = []

for i in range(size):
    b = np.random.rand(size, size)
    a.append(b)

for i in a:
    print(i)

numpy显示内存错误的原因:

Traceback (most recent call last):
  File "stress1.py", line 8, in <module>
    b = np.random.rand(size, size)
  File "mtrand.pyx", line 1156, in numpy.random.mtrand.RandomState.rand
  File "mtrand.pyx", line 421, in numpy.random.mtrand.RandomState.random_sample
  File "_common.pyx", line 256, in numpy.random._common.double_fill
MemoryError: Unable to allocate 763. MiB for an array with shape (10000, 10000) and data type float64

stress2.py: 使用 Python 标准库

size = 1_000_000_000

a = []
for _ in range(20):
    b = list(range(size))
    a.append(b)

for i in a:
    print(i)

脚本显示

Traceback (most recent call last):
  File "stress3.py", line 6, in <module>
    b = list(range(size))
MemoryError

如果您可以分享您使用的代码或库,我相信 stackoverflow 中的某个人可以提供帮助。


推荐阅读