Gvim7.3 + Python3 接口的内存使用完全失控 - Jacky Liu's Blog
Gvim7.3 + Python3 接口的内存使用完全失控
---- 为什么会有这种鸟事,为什么为什么。一度以为 Vim 已经很熟不需要再搞了,谁知道风平浪静的日子是没有的。快抓狂了。Vim 是这么成熟的编辑器,这种事难道该发生么。
---- 原本以为是 Python 代码写的有问题,对 Python 不熟,内存泄漏什么的。逐渐排除了以后开始锁定到 Python 接口上面,具体讲就是 vim.buffer 这个东西。这个是测试代码:
lcd %:h tabedit tmpbuffer setlocal buftype=nofile python3 << EOF for i in range(3): flines= ['x'*200] * 50000 vim.command("%s+\\_.*++g") for fl in flines: vim.current.buffer.append(fl) del flines[:] EOF
---- 而这个是结果:
在 gvim7.2 + Python2 接口下面:
第 1 次 source: 46.8 MB 内存,关闭 tmpbuffer 后不变
第 2 次 source: 59.2 MB 内存,关闭 tmpbuffer 后 58.1
第 3 次 source: 61.6 MB 内存,关闭 tmpbuffer 后 60.4
第 4 次 source: 63.9 MB 内存,关闭 tmpbuffer 后 63.6
第 5 次 source: 66.3 MB 内存,关闭 tmpbuffer 后 65.1
在 gvim7.3 + Python3 接口下面:
第 1 次 source: 142.6 MB 内存,关闭 tmpbuffer 后不变
第 2 次 source: 238.5 MB 内存,关闭 tmpbuffer 后不变
第 3 次 source: 334.5 MB 内存,关闭 tmpbuffer 后不变
---- buftype 选项其实对结果无影响。第一个看上去还好。第二个,好像 gvim7.3 的 Python3 接口是没有任何内存回收的,就这么任由它增长。另外初次运行的内存消耗也是 gvim7.2 的三倍。这没问题么? 问题大了。后来索性一直运行,这个是最后的结果:
---- 我表示这不是我的问题。考虑把这个贴到 vim-use 群里面。
---- 这个很打击我写插件的热情。不过还是要写,不写就亏大了,尼玛感觉就跟炒股被套一样。昨天新加的:
1. 丰富了颜色
2. 添加了功能: 除当前节点和它的上级节点之外,关闭其它所有打开的节点。
3. 添加了功能: 锁定根节点,只能在根节点内部浏览。
2011年4月19日 12:38
这个 bug 有点难修,我有空研究下。
其实 Vim 的 Python3 接口一直都很不成熟的。貌似 Vim 的开发者都不怎么用脚本语言。
2011年4月19日 16:51
这个是我的错。。。。已经全部修正,放在这里了(针对 Vim 7.3.161 源码的补丁): http://lilydjwg.is-programmer.com/pages/19540.html
2011年4月19日 18:28
@依云: 拜谢。没有这个我真要崩溃了,我可不想浏览个文件夹就用了 200 MB 内存。我现在转研究编译了,有问题我请教你。
2011年4月19日 20:50
@依云: 请问,官网上的源码,就是这里:http://www.vim.org/sources.php 都是不带任何 patch 的对吧?有什么快捷的方法能把哪些 patch 打上的没有?
2011年4月19日 21:39
@蓝色基因: 应该是的。你用 curl/wget/downthemall/etc 把那 161 个补丁下回来,然后一个 for i in /path/7.3*; do patch -p0 < $i; done
2011年4月19日 21:44
@依云: 嗯晓得了,下载中 。。。
2011年4月20日 21:02
@蓝色基因: 今天再次更新,修正一些小问题。
2011年4月20日 23:22
@依云: 晓得了
2011年4月22日 16:16
@依云: 我今天下午在试着编译,patch 的结果出来,有 4 个地方 fail 了,另外还有许多地方检测到好像已经打过,跳过去了。能帮我看看吗?我可以把结果文件 email 给你。
2011年4月22日 16:47
@蓝色基因: 你应该把以前打的那个补丁除掉然后再打。算了,我传份打好补丁的吧,在这里 http://dl.dbank.com/c0zcdra7tf 。
2011年4月22日 16:50
@依云: 啊太好了,感谢!你是说官网上那 161 个补丁里有包括你先前写的那个对吧?
2011年4月22日 17:01
@蓝色基因: 官网上那个不包含我的补丁啊。
2011年4月22日 17:17
@依云: 我是新下的源文件,逐个打了那 161 个,最后打的你最新改的这个,那 161 个结果看起来还好,最后这个有 4 个地方 fail 还有许多的 skip。可能是我目录放的不对,我在 src 上面一级单建了一个目录存放所有这些 patch 文件,最后那个文件是用 -p1 参数跑的。不管了,你给的这个源码看上去很好,已经在装了。
2011年4月22日 17:28
@依云: 跑起来了!这回挺顺利的,呵呵。感谢。结果大幅改善,每次关闭打开 45000 个节点,只多用 不到 10 M 内存了。上个版本是 100 多 M,太恐怖了!
2011年4月22日 17:33
@依云: 在两个窗口里同时打开,最多 270 MB 左右。还想做点测试跟优化,还有两个功能没加。差不多了我就贴上来。
2011年4月22日 17:35
@蓝色基因: 我尝试了下,那个补丁是有些问题,现已更新。
2023年5月18日 12:23
Learn the reasons why your refrigerator or air conditioner isn't chilling properly, as well as how to properly fill the gas tank. the causes of a noisy air conditioner or refrigerator The refrigerator and air conditioner leak water due to the refrigerator's failure to refrigerationpedia.com properly freeze ice.causes of ice freezing incorrectly in refrigerators. How can I change the thermostat in my refrigerator and why does it have so much ice in it? For a refrigerator, is a compressor AC or DC? Which one is better? Which refrigerator gas—R134, R600, or R290—is the best.