Gvim7.3 + Python3 接口的内存使用完全失控 - Jacky Liu's Blog

Gvim7.3 + Python3 接口的内存使用完全失控

Jacky Liu posted @ 2011年4月19日 09:59 in Vim with tags vim python , 3940 阅读

    ---- 为什么会有这种鸟事,为什么为什么。一度以为 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. 添加了功能: 锁定根节点,只能在根节点内部浏览。

Avatar_small
依云 说:
2011年4月19日 12:38

这个 bug 有点难修,我有空研究下。

其实 Vim 的 Python3 接口一直都很不成熟的。貌似 Vim 的开发者都不怎么用脚本语言。

Avatar_small
依云 说:
2011年4月19日 16:51

这个是我的错。。。。已经全部修正,放在这里了(针对 Vim 7.3.161 源码的补丁): http://lilydjwg.is-programmer.com/pages/19540.html

Avatar_small
蓝色基因 说:
2011年4月19日 18:28

@依云: 拜谢。没有这个我真要崩溃了,我可不想浏览个文件夹就用了 200 MB 内存。我现在转研究编译了,有问题我请教你。

Avatar_small
蓝色基因 说:
2011年4月19日 20:50

@依云: 请问,官网上的源码,就是这里:http://www.vim.org/sources.php 都是不带任何 patch 的对吧?有什么快捷的方法能把哪些 patch 打上的没有?

Avatar_small
依云 说:
2011年4月19日 21:39

@蓝色基因: 应该是的。你用 curl/wget/downthemall/etc 把那 161 个补丁下回来,然后一个 for i in /path/7.3*; do patch -p0 < $i; done

Avatar_small
蓝色基因 说:
2011年4月19日 21:44

@依云: 嗯晓得了,下载中 。。。

Avatar_small
依云 说:
2011年4月20日 21:02

@蓝色基因: 今天再次更新,修正一些小问题。

Avatar_small
蓝色基因 说:
2011年4月20日 23:22

@依云: 晓得了

Avatar_small
蓝色基因 说:
2011年4月22日 16:16

@依云: 我今天下午在试着编译,patch 的结果出来,有 4 个地方 fail 了,另外还有许多地方检测到好像已经打过,跳过去了。能帮我看看吗?我可以把结果文件 email 给你。

Avatar_small
依云 说:
2011年4月22日 16:47

@蓝色基因: 你应该把以前打的那个补丁除掉然后再打。算了,我传份打好补丁的吧,在这里 http://dl.dbank.com/c0zcdra7tf 。

Avatar_small
蓝色基因 说:
2011年4月22日 16:50

@依云: 啊太好了,感谢!你是说官网上那 161 个补丁里有包括你先前写的那个对吧?

Avatar_small
依云 说:
2011年4月22日 17:01

@蓝色基因: 官网上那个不包含我的补丁啊。

Avatar_small
蓝色基因 说:
2011年4月22日 17:17

@依云: 我是新下的源文件,逐个打了那 161 个,最后打的你最新改的这个,那 161 个结果看起来还好,最后这个有 4 个地方 fail 还有许多的 skip。可能是我目录放的不对,我在 src 上面一级单建了一个目录存放所有这些 patch 文件,最后那个文件是用 -p1 参数跑的。不管了,你给的这个源码看上去很好,已经在装了。

Avatar_small
蓝色基因 说:
2011年4月22日 17:28

@依云: 跑起来了!这回挺顺利的,呵呵。感谢。结果大幅改善,每次关闭打开 45000 个节点,只多用 不到 10 M 内存了。上个版本是 100 多 M,太恐怖了!

Avatar_small
蓝色基因 说:
2011年4月22日 17:33

@依云: 在两个窗口里同时打开,最多 270 MB 左右。还想做点测试跟优化,还有两个功能没加。差不多了我就贴上来。

Avatar_small
依云 说:
2011年4月22日 17:35

@蓝色基因: 我尝试了下,那个补丁是有些问题,现已更新。


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter
Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee