最近做一个作业,学习神经网络,然后不想跑一次电脑就轰轰响,就放到云服务器上跑,服务器是一个 1G 的那种学生机。
代码就是读取一些文本文件,IMDB 这个数据集,大概几万个文件,然后就词向量什么的搞成一个矩阵,然后跑神经网络,大概就是这样。
我在 pycharm 里用 ssh 远程解释器跑的,为了不频繁的 ssh 连接,我就勾选了那个 run with python console,然后我就发现,正常跑了一次代码之后,没有问题,控制台也正常显示>>>,这时候如果再跑刚才那个程序,就会报错
Process finished with exit code 137 (interrupted by signal 9: SIGKILL)
这个错误应该是内存不足导致的,然后我就用 top 命令查看了服务器的情况,发现明明代码已经跑完,但是还是 python3 的一个进程还占用接近 50%的内存?是还在读取文件什么吗,但是我上一个程序已经正常跑完了。
文件也不太大,我都是 open,然后 read 这样读取的,所有 open 的地方也都 close 了。
这可能会是哪里出问题了呢?
1
laike9m 2020-05-26 00:26:30 +08:00 1
看一下这篇文章吧。有一些工具可以 debug 内存泄露
https://medium.com/zendesk-engineering/hunting-for-memory-leaks-in-python-applications-6824d0518774 |
2
xcstream 2020-05-26 00:34:57 +08:00 1
可以开启 swap
|
3
vk42 2020-05-26 01:07:59 +08:00 1
看下对应的 cmdline ?目测是你的 python console,如果你直接在 console 里面跑的脚本,有些资源是不会释放的
|
4
ipwx 2020-05-26 01:19:38 +08:00 1
建议 deployment + 远程 ssh 执行代码。
|
6
ipwx 2020-05-26 12:12:22 +08:00
@zxCoder 远程 jupyter notebook,本地写代码,deployment 到远程,然后在远程的 jupyter notebook 上运行。
|
7
ipwx 2020-05-26 12:12:46 +08:00
jupyter notebook 可以有 notebook (可视化) 也可以有 terminal 。
|
8
ipwx 2020-05-26 12:14:15 +08:00
|
10
ipwx 2020-05-26 14:06:23 +08:00
|
12
ipwx 2020-05-26 14:15:40 +08:00
@zxCoder 教你一招,把你的工作目录建一个 python package 比如 mylib 。启动 jupyter 的时候把工作目录加到 PYTHONPATH,然后你就能在 Jupyter notebook import 你自己的代码了。
|
13
zxCoder OP @ipwx 这个好像每跑一次脚本都会 ssh 连接一次?刚才华为云直接打电话来问我这几天一直登录服务器有什么问题吗。。。。。
|
15
sujin190 2020-05-27 15:51:56 +08:00
内存小就每次 ssh 进去跑最好了,确保每次跑完进程都退出重启,多连几次 ssh 也没啥吧
|
16
tblxdezhu 2020-05-28 16:02:25 +08:00
尽量不要手动 close(),老老实实用 with 。有可能句柄没释放
|
17
fhsan 2020-05-29 09:55:01 +08:00
我都是 yield,公司同事发给我一个 excel,看了下都是空白,可偏偏 20M,程序解析 100W 行,excel 最大值了
使用 yield 按批次处理? cpython open 有时候资源不会自动释放,ipython jupyter 之类资源不会释放,比如 [line for f in open(file)] p = psutil.Process() p.open_files() |