于是我开始寻找解决方案,发现在系统响应慢主要是由于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。