V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
zxCoder
V2EX  ›  Python

Python 内存的一个问题

  •  
  •   zxCoder · 2020-05-25 23:32:07 +08:00 · 3159 次点击
    这是一个创建于 1641 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    17 条回复    2020-05-29 09:55:01 +08:00
    laike9m
        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
    xcstream
        2
    xcstream  
       2020-05-26 00:34:57 +08:00   ❤️ 1
    可以开启 swap
    vk42
        3
    vk42  
       2020-05-26 01:07:59 +08:00   ❤️ 1
    看下对应的 cmdline ?目测是你的 python console,如果你直接在 console 里面跑的脚本,有些资源是不会释放的
    ipwx
        4
    ipwx  
       2020-05-26 01:19:38 +08:00   ❤️ 1
    建议 deployment + 远程 ssh 执行代码。
    zxCoder
        5
    zxCoder  
    OP
       2020-05-26 08:35:01 +08:00
    @ipwx 一开始用的 deployment 这个,不过服务端画的图没办法在本地显示
    ipwx
        6
    ipwx  
       2020-05-26 12:12:22 +08:00
    @zxCoder 远程 jupyter notebook,本地写代码,deployment 到远程,然后在远程的 jupyter notebook 上运行。
    ipwx
        7
    ipwx  
       2020-05-26 12:12:46 +08:00
    jupyter notebook 可以有 notebook (可视化) 也可以有 terminal 。
    ipwx
        8
    ipwx  
       2020-05-26 12:14:15 +08:00


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

    这个是 Jupyter Notebook + JupyterLab 插件。
    zxCoder
        11
    zxCoder  
    OP
       2020-05-26 14:11:50 +08:00
    @ipwx 输出文件这个好像不错 哈哈
    ipwx
        12
    ipwx  
       2020-05-26 14:15:40 +08:00
    @zxCoder 教你一招,把你的工作目录建一个 python package 比如 mylib 。启动 jupyter 的时候把工作目录加到 PYTHONPATH,然后你就能在 Jupyter notebook import 你自己的代码了。
    zxCoder
        13
    zxCoder  
    OP
       2020-05-26 15:24:43 +08:00
    @ipwx 这个好像每跑一次脚本都会 ssh 连接一次?刚才华为云直接打电话来问我这几天一直登录服务器有什么问题吗。。。。。
    ipwx
        14
    ipwx  
       2020-05-26 15:52:51 +08:00
    @zxCoder emmm pycharm 的 deployment 是会连接啊,要么你换成手工 rsync 。
    sujin190
        15
    sujin190  
       2020-05-27 15:51:56 +08:00
    内存小就每次 ssh 进去跑最好了,确保每次跑完进程都退出重启,多连几次 ssh 也没啥吧
    tblxdezhu
        16
    tblxdezhu  
       2020-05-28 16:02:25 +08:00
    尽量不要手动 close(),老老实实用 with 。有可能句柄没释放
    fhsan
        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()
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1016 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 19:55 · PVG 03:55 · LAX 11:55 · JFK 14:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.