python - 为什么系统杀死了我的 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运行程序时,它不会被杀死。
解决方案
您的程序可能请求的内存超出了进度可用的内存。对于 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 中的某个人可以提供帮助。
推荐阅读
- time-complexity - 如何评估以下代码的渐近复杂度?
- typescript - 动态更改对象属性时的打字稿错误
- javascript - d3条形图在加载时从高度0增长到条形
- python - 根据条件跳过函数执行
- typescript - typeorm/postresql - 创建一个按列分组的查询,聚合另一列并获取聚合数组的关系
- node.js - Visual Studio Code 的 Intellisense 无法识别 npm 安装的包
- github - 将 Github Pages URL 添加到 Github 存储库的 About 部分
- amazon-web-services - 查询处理的 S3 存储桶与该集群位于不同的区域,但 parquet 文件不支持区域参数
- pandas - 为什么不是在运行 Geopy 刮黄页时生成所有坐标?
- vue.js - 根据路由参数在启动时加载 Vuex 状态