在网上找了一段 python 代码,分析服务器将近 2G 的 log 文件,代码执行过程中突然发现狗日的只有 open 没有 close ! Ctrl+C 终止程序的执行后查看内存,发现 Swap 几乎都被消耗殆尽,现在我要怎样才能安全地回收内存?
1
xingso 2016-01-22 11:38:23 +08:00
重启电脑可治百病
|
3
28ms 2016-01-22 11:39:30 +08:00
with open('logfile', 'r') as filehandler:
# do your work # end |
4
yuankui 2016-01-22 11:41:13 +08:00
程序退出了内存不就好了吗?
|
5
Tinet 2016-01-22 11:47:16 +08:00
楼上说得对, python 有垃圾回收机制,程序退出后,占用的内存也会释放。你看到 swap 并没有释放应该是 linux 系统的内存使用策略问题,不会影响服务器的正常使用。
|
7
Yourdaye OP @yuankui 对 linux 不是很了解,#echo 3 > /proc/sys/vm/drop_caches ,用了这个命令,貌似作用不大
|
8
dndx 2016-01-22 11:50:12 +08:00 1
Python 就算 open 再大的文件也不会直接把所有内容读到内存。要是你直接 read() 了当我没说。
|
10
neoblackcap 2016-01-22 12:03:21 +08:00
@Tinet +1
|
11
harry890829 2016-01-22 12:09:15 +08:00
这个就算是 c/c++这种没有回收机制的,在 Linux 上和楼主做了同样的事情后, kill 掉也能把占用内存释放啊
|
12
eliteYang 2016-01-22 12:12:39 +08:00
可以设置 log 滚动,再加上一些内存管理,例如 tcmalloc ,可以定时回收内存
|
13
Garantion 2016-01-22 12:19:26 +08:00
pkill python
|
14
Andiry 2016-01-22 12:24:10 +08:00
杀掉进程就行。其实 close 不 close 无所谓,只是多占用一个 file descriptor
|
15
upwell 2016-01-22 12:24:56 +08:00
|
16
shyling 2016-01-22 12:29:04 +08:00 via iPad
open 无所谓的啊,不要一次 read 。。另外进程结束时系统会关闭 fd 的
|
17
salmon5 2016-01-22 13:08:46 +08:00
这就是 java 中的所谓内存泄漏?
|
18
yonka 2016-01-22 13:19:52 +08:00
你不 close 也只是句柄没被释放啊,怎么会把内存是吗?
f = open(fpath) data = f.read() 这样吗? = = |
21
Kirscheis 2016-01-22 13:42:53 +08:00 via Android
让你不用 with 。。
只是 swap 看上去被占了,应该问题不大吧 |
22
mrytsr 2016-01-23 13:05:13 +08:00 via Android
Sb
|
23
heshaobo 2016-01-24 22:14:38 +08:00
文件操作请使用 with 语句
|