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

2016-01-22 11:32:35 +08:00
 Yourdaye

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

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

程序都退出了还占个啥内存……
Tinet
2016-01-22 13:38:00 +08:00
@realpg 确实不是 gc 的问题,是 linux 的内存利用策略的问题,占用的交换空间并不因为程序退出而主动释放。

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

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

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

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

© 2021 V2EX