Python 内存的一个问题

2020-05-25 23:32:07 +08:00
 zxCoder

最近做一个作业,学习神经网络,然后不想跑一次电脑就轰轰响,就放到云服务器上跑,服务器是一个 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 了。

这可能会是哪里出问题了呢?

3002 次点击
所在节点    Python
17 条回复
laike9m
2020-05-26 00:26:30 +08:00
看一下这篇文章吧。有一些工具可以 debug 内存泄露
https://medium.com/zendesk-engineering/hunting-for-memory-leaks-in-python-applications-6824d0518774
xcstream
2020-05-26 00:34:57 +08:00
可以开启 swap
vk42
2020-05-26 01:07:59 +08:00
看下对应的 cmdline ?目测是你的 python console,如果你直接在 console 里面跑的脚本,有些资源是不会释放的
ipwx
2020-05-26 01:19:38 +08:00
建议 deployment + 远程 ssh 执行代码。
zxCoder
2020-05-26 08:35:01 +08:00
@ipwx 一开始用的 deployment 这个,不过服务端画的图没办法在本地显示
ipwx
2020-05-26 12:12:22 +08:00
@zxCoder 远程 jupyter notebook,本地写代码,deployment 到远程,然后在远程的 jupyter notebook 上运行。
ipwx
2020-05-26 12:12:46 +08:00
jupyter notebook 可以有 notebook (可视化) 也可以有 terminal 。
ipwx
2020-05-26 12:14:15 +08:00


zxCoder
2020-05-26 13:54:41 +08:00
@ipwx 谢谢提醒,不过我不太习惯 notebook 写起来很别扭
ipwx
2020-05-26 14:06:23 +08:00
@zxCoder 不用 notebook 你可以把画图脚本上传上去,然后左边找到输出文件,打开看就行了。

这个是 Jupyter Notebook + JupyterLab 插件。
zxCoder
2020-05-26 14:11:50 +08:00
@ipwx 输出文件这个好像不错 哈哈
ipwx
2020-05-26 14:15:40 +08:00
@zxCoder 教你一招,把你的工作目录建一个 python package 比如 mylib 。启动 jupyter 的时候把工作目录加到 PYTHONPATH,然后你就能在 Jupyter notebook import 你自己的代码了。
zxCoder
2020-05-26 15:24:43 +08:00
@ipwx 这个好像每跑一次脚本都会 ssh 连接一次?刚才华为云直接打电话来问我这几天一直登录服务器有什么问题吗。。。。。
ipwx
2020-05-26 15:52:51 +08:00
@zxCoder emmm pycharm 的 deployment 是会连接啊,要么你换成手工 rsync 。
sujin190
2020-05-27 15:51:56 +08:00
内存小就每次 ssh 进去跑最好了,确保每次跑完进程都退出重启,多连几次 ssh 也没啥吧
tblxdezhu
2020-05-28 16:02:25 +08:00
尽量不要手动 close(),老老实实用 with 。有可能句柄没释放
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()

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/675442

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX