还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

系统字体配置、中文显示和输入法问题
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#1

帖子 hubert_star » 2010-11-21 14:54

在使用我之前发布的几个词库文件时,如果大家用的是sunpinyin或者是ibus-pinyin,会感觉响应比较慢,虽然在我机器上感觉还可以,但是在系统负载上来以后明显感觉迟钝。

于是我开始寻找解决方案,发现在系统响应慢主要是由于sqlite检索造成的,磁盘文件的频繁定位查找,加重了系统的io开销,而sqlite似乎是直接的磁盘查找,所以我决定解决这个问题。

第一种尝试方法,就是使用sqlite的:memory:数据库,打开数据库的时候复制磁盘内容到内存中,然后在关闭的时候同步到磁盘上。但是这种办法行成了一个多达几十k的patch,而且效果一般,尤其是启动的时候速度很慢。

接下来我尝试了第二种解决办法,就是把userdict这个几十m的文件,每20分钟cat userdict > /dev/null,保证系统缓存了这个文件,但是这个办法太老土了,不能保证你复制过文件之后还有很快的输入法响应速度。

看来,从代码解决还是交给sunpinyin/ibus的开发组吧,我们还是手动用bash来解决这个问题。

我注意到shm这个东西,也就是tmpfs,文件放在内存中,从sqlite的检索能力来看,上百兆的文件检索应该很快。于是,我把userdict放到shm里面,把.sunpinyin/userdict符号链接一下,然后每隔一段时间同步下来词库到磁盘上的另外一个文件里面。

用了一天的时间,写了很多东西,发现就算我echo 1 > /proc/sys/vm/drop_caches,输入法也会有很快的响应速度。

初步达到了目的,仅仅作为小技巧,在内存不是问题的今天,瓶颈在io上,希望输入法开发组能开发一个切实有效的词库缓存机制。

我把操作写成了一个sh脚本,这个只是用在我的gentoo上的,而且内容是随手写的,只是给大家一个方法参考,不要直接去拷贝这个内容运行。

代码: 全选


#!/bin/bash

SUN_DIR="${HOME}/.sunpinyin"
SHM_USERDICT="/dev/shm/sunpinyin_userdict.sh0"
CURRENT_PWD=`pwd`

cd "${SUN_DIR}"

if [ ! -e "${SUN_DIR}/userdict.real" ]
then
	if [ ! -h "${SUN_DIR}/userdict" ]
	then
		mv "${SUN_DIR}/userdict" "${SUN_DIR}/userdict.real"
	else
		echo "ERROR: can't find userdict!"
		exit 1
	fi
fi

if [ ! -e "${SUN_DIR}/userdict.real.tar.xz" ]
then
	echo "NOTICE: can't find backup file: , will be backup it, please waiting..."
	tar -cpJf "${SUN_DIR}/userdict.real.tar.xz" userdict.real
	echo "NOTICE: backup finished, you can restore user dict from userdict.real.tar.xz !"
fi

if [ ! -e "${SHM_USERDICT}" ]
then
	cp "${SUN_DIR}/userdict.real" "${SHM_USERDICT}" -rf
fi

ln -sf "${SHM_USERDICT}" "${SUN_DIR}/userdict"

echo "Cache OK."

cd "${CURRENT_PWD}"

fcitx &

echo "Fcitx started."

p_count=0
while [ true ]
do
	p_count=$(($p_count+1))
	sleep 1800
	
	p_size_shm=$(ls -l "${SHM_USERDICT}" | awk '{print $5}')
	p_size_real_t=$(ls -l "${SUN_DIR}/userdict.real" | awk '{print $5}')
	p_size_real=$(($p_size_real_t+512))
	
	if [ $p_count == 4 ]
	then
		p_count=0
		cp "${SHM_USERDICT}" "${SUN_DIR}/userdict.real" -rf
		echo "Sunpinyin user dict backup ok."
	fi
	
	if [ $p_size_shm -ge $p_size_real ]
	then
		echo "p_size_shm is $p_size_shm   --------- p_size_real is $p_size_real "
		cp "${SHM_USERDICT}" "${SUN_DIR}/userdict.real" -rf
		echo "Sunpinyin user dict backup ok."
	fi
done


另外,坛子里面有朋友使用了笔记本的gps设备吗?我的笔记本里面有gps定位,是wwan5540带的,但是找不到设备,折腾内核折腾了好久没发现解决办法,而我插上sim卡倒是能正常上网,速度也很快,除了gps。
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#2

帖子 hubert_star » 2010-11-22 0:19

晕,没人看
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
头像
qiang_liu8183
论坛版主
帖子: 10699
注册时间: 2006-09-10 22:36
系统: Arch Debian
来自: 北京

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#3

帖子 qiang_liu8183 » 2010-11-22 0:32

:mrgreen:
看破、放下、自在、随缘、念佛
真诚、清净、平等、正觉、慈悲
头像
david_pi
帖子: 91
注册时间: 2010-03-28 1:52

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#4

帖子 david_pi » 2010-11-22 10:03

楼主高人。
希望linux下面的中文输入能做好点。
york824
帖子: 965
注册时间: 2007-11-07 22:01

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#5

帖子 york824 » 2010-11-24 1:33

脚本看不懂,有ubuntu适用的吗?用了大词库之后确实很容易响应变慢甚至整个输入法崩溃掉
york824
帖子: 965
注册时间: 2007-11-07 22:01

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#6

帖子 york824 » 2010-12-20 21:38

楼主能够提供一下这个方法在ubuntu下的实现吗?我也很想把词库都放到内存里面去,反正内存用不完

最好是傻瓜式的,不然像主楼那样的东西实在是看不懂。。。
头像
BYVoid
帖子: 50
注册时间: 2010-04-12 11:37
联系:

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#8

帖子 BYVoid » 2010-12-26 0:13

這個解決起來很難,因為內存畢竟有限,把詞庫全部加載到內存中很不合適,尤其是在一些比較老的電腦和其他的平臺上面(如Meego)。此外還有不少用戶看到一個輸入法佔用這麼多內存就會非常不滿,這不能不考慮。系統比較繁忙時比較卡是內核任務調度的問題,最新的內核補丁有了重大改進。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#9

帖子 eexpress » 2010-12-26 0:16

打到黑爪子。歪门邪道。
还是放弃ibus吧。
:em04

支持xim
● 鸣学
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#10

帖子 hubert_star » 2010-12-26 0:35

BYVoid 写了:這個解決起來很難,因為內存畢竟有限,把詞庫全部加載到內存中很不合適,尤其是在一些比較老的電腦和其他的平臺上面(如Meego)。此外還有不少用戶看到一個輸入法佔用這麼多內存就會非常不滿,這不能不考慮。系統比較繁忙時比較卡是內核任務調度的問題,最新的內核補丁有了重大改進。
并不是内核调度问题,而是因为sqlite查询时缓存失效比较快,不得已去检索硬盘文件而导致响应过慢

当然这个不是sqlite的问题,毕竟词组的随意性太大了,退化到缓存全部,也就是整个载入了

一个40M的文件缓存一下,对于拥有2G以上内存的用户来说问题不大
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
头像
BYVoid
帖子: 50
注册时间: 2010-04-12 11:37
联系:

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#11

帖子 BYVoid » 2010-12-26 0:46

hubert_star 写了:
BYVoid 写了:這個解決起來很難,因為內存畢竟有限,把詞庫全部加載到內存中很不合適,尤其是在一些比較老的電腦和其他的平臺上面(如Meego)。此外還有不少用戶看到一個輸入法佔用這麼多內存就會非常不滿,這不能不考慮。系統比較繁忙時比較卡是內核任務調度的問題,最新的內核補丁有了重大改進。
并不是内核调度问题,而是因为sqlite查询时缓存失效比较快,不得已去检索硬盘文件而导致响应过慢

当然这个不是sqlite的问题,毕竟词组的随意性太大了,退化到缓存全部,也就是整个载入了

一个40M的文件缓存一下,对于拥有2G以上内存的用户来说问题不大
雖然不少用戶都擁有不少於2G的內存,但我們不能假定所有用戶都是這樣,所以無法在上游做出改動,尤其是ibus-pinyin還要兼容meego平臺。到底怎麼解決我也沒想好。
實際上系統繁忙的時候顯得慢確實與任務調度有關,用了新的內核也有很大改觀。
头像
hubert_star
论坛版主
帖子: 5373
注册时间: 2007-10-29 22:12
系统: OSX 10.9 + Ub 1304
来自: 江苏南京

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#12

帖子 hubert_star » 2010-12-26 1:10

额,忘记说了,我用的不是ibus,是fcitx-sunpinyin,使用了为ibus做的用户词库而已

原理是一样的,sunpinyin的用户词库部分也使用了sqlite来做

我追踪了好久,当sqlite词库不大的时候,仅第一次查询稍慢

如果词库增长到几十m的话,sqlite的查询硬盘访问就比较频繁了

一旦硬盘有访问系统响应顿时下来

新36内核中的调度改进可能改善了一些,这个我不是很清楚,但是对于访问磁盘的逻辑来说不是优化调度,而是尽可能减少访问次数

毕竟硬盘访问的读取速度在那

不过桌面环境和移动环境还是有一些不同的

桌面环境有足够大的内存和运算能力,而移动环境一点资源都是非常宝贵的

对于ibus/sunpinyin这类环境来说,是否有必要fork,或者通过配置选项启用内存缓存?

仅仅是讨论而已,ibus功能已经很强大了,现在是优化的时候了
佛经说,人有八苦: 生、老、病、死、求不得、怨憎、爱别离、五阴盛 故我苦!
圣经说,人有七罪: 饕餮、贪婪、懒惰、淫欲、傲慢、嫉妒和暴怒  故我有罪!

我这篇帖子里面没有任何攻击我们伟大的中华人民共和国政府和任劳任怨的人民公仆(和本论坛高素质的版主)的文字和含义;

特此声明!

有些事,我们明知道是错的,也要去坚持,因为不甘心;有些人,我们明知道是爱的,也要去放弃,因为没结局;有时候,我们明知道没路了,却还在前行,因为习惯了。

欢迎来我的新浪微博@me
头像
anonymity
帖子: 645
注册时间: 2009-03-14 16:31
来自: 不在故乡的地方

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#13

帖子 anonymity » 2010-12-26 3:36

感觉这种解决方式也不是很好,如果这个问题没法解决的话,估计sunpinyin很难用的起来。
Only the dead have seen the end of war!
york824
帖子: 965
注册时间: 2007-11-07 22:01

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#14

帖子 york824 » 2010-12-26 7:36

我用词库导入工具慢慢地尝试,词库在10几M的时候还是很快的,fcitx-sunpinyin,输入速度基本上没觉得有影响

再往上就感觉明显慢了,硬盘灯一直闪。80多M的那个词库,基本上没有实用价值。

我倒是不怕内存占用,多200M都没问题,但是没找到能够把整个词库放进内存的方法。现在的笔记本是4G内存,下次买台机,起码要8G内存才够了,现在的输入法也应该考虑一下为不愁内存占用的用户提供一个可以提高输入效率的选项吧。
bob.robot
帖子: 74
注册时间: 2008-07-26 13:31
联系:

Re: 还是关于词库的,sunpinyin或者是ibus-pinyin响应慢的解决办法

#15

帖子 bob.robot » 2011-01-09 13:15

唔,这是一个好办法~!
Welcome to my blog: Robot Shell

Contact me: bob1211@gmail.com
回复