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

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