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