推荐学习书目
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
Yourdaye
V2EX  ›  Python

open 了一个 2G 的 file,忘了 close

  •  
  •   Yourdaye · Jan 22, 2016 · 5047 views
    This topic created in 3775 days ago, the information mentioned may be changed or developed.

    在网上找了一段 python 代码,分析服务器将近 2G 的 log 文件,代码执行过程中突然发现狗日的只有 open 没有 close ! Ctrl+C 终止程序的执行后查看内存,发现 Swap 几乎都被消耗殆尽,现在我要怎样才能安全地回收内存?

    23 replies    2016-01-24 22:14:38 +08:00
    xingso
        1
    xingso  
       Jan 22, 2016
    重启电脑可治百病
    Yourdaye
        2
    Yourdaye  
    OP
       Jan 22, 2016
    @xingso 服务器不能随便重启啊
    28ms
        3
    28ms  
       Jan 22, 2016
    with open('logfile', 'r') as filehandler:
    # do your work
    # end
    yuankui
        4
    yuankui  
       Jan 22, 2016
    程序退出了内存不就好了吗?
    Tinet
        5
    Tinet  
       Jan 22, 2016
    楼上说得对, python 有垃圾回收机制,程序退出后,占用的内存也会释放。你看到 swap 并没有释放应该是 linux 系统的内存使用策略问题,不会影响服务器的正常使用。
    xingso
        6
    xingso  
       Jan 22, 2016
    @Yourdaye 6666 。。。我以为你把日志文件传回来分析的。。没想到直接用服务器分析
    Yourdaye
        7
    Yourdaye  
    OP
       Jan 22, 2016
    @yuankui 对 linux 不是很了解,#echo 3 > /proc/sys/vm/drop_caches ,用了这个命令,貌似作用不大
    dndx
        8
    dndx  
       Jan 22, 2016   ❤️ 1
    Python 就算 open 再大的文件也不会直接把所有内容读到内存。要是你直接 read() 了当我没说。
    Yourdaye
        9
    Yourdaye  
    OP
       Jan 22, 2016
    @Tinet 多谢
    neoblackcap
        10
    neoblackcap  
       Jan 22, 2016
    @Tinet +1
    harry890829
        11
    harry890829  
       Jan 22, 2016
    这个就算是 c/c++这种没有回收机制的,在 Linux 上和楼主做了同样的事情后, kill 掉也能把占用内存释放啊
    eliteYang
        12
    eliteYang  
       Jan 22, 2016
    可以设置 log 滚动,再加上一些内存管理,例如 tcmalloc ,可以定时回收内存
    Garantion
        13
    Garantion  
       Jan 22, 2016
    pkill python
    Andiry
        14
    Andiry  
       Jan 22, 2016
    杀掉进程就行。其实 close 不 close 无所谓,只是多占用一个 file descriptor
    upwell
        15
    upwell  
       Jan 22, 2016
    shyling
        16
    shyling  
       Jan 22, 2016 via iPad
    open 无所谓的啊,不要一次 read 。。另外进程结束时系统会关闭 fd 的
    salmon5
        17
    salmon5  
       Jan 22, 2016
    这就是 java 中的所谓内存泄漏?
    yonka
        18
    yonka  
       Jan 22, 2016
    你不 close 也只是句柄没被释放啊,怎么会把内存是吗?
    f = open(fpath)
    data = f.read()
    这样吗? = =
    realpg
        19
    realpg  
    PRO
       Jan 22, 2016
    @Tinet
    这个不是 python gc 的问题吧……

    程序都退出了还占个啥内存……
    Tinet
        20
    Tinet  
       Jan 22, 2016
    @realpg 确实不是 gc 的问题,是 linux 的内存利用策略的问题,占用的交换空间并不因为程序退出而主动释放。
    Kirscheis
        21
    Kirscheis  
       Jan 22, 2016 via Android
    让你不用 with 。。
    只是 swap 看上去被占了,应该问题不大吧
    mrytsr
        22
    mrytsr  
       Jan 23, 2016 via Android
    Sb
    heshaobo
        23
    heshaobo  
       Jan 24, 2016
    文件操作请使用 with 语句
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2966 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 80ms · UTC 13:03 · PVG 21:03 · LAX 06:03 · JFK 09:03
    ♥ Do have faith in what you're doing.