ZSaberLv0 / ZFVimIM

vim输入法 / Vim Input Method by pure vim script, support: user word, dynamic word priority, cloud db files
204 stars 14 forks source link

使用缓存加快词典文件载入 #14

Closed suliveevil closed 4 years ago

suliveevil commented 4 years ago

https://github.com/tumashu/pyim/blob/master/pyim-dhashcache.el https://github.com/tumashu/pyim/blob/master/pyim-dregcache.el

测试了一个超大词典 https://github.com/suliveevil/pyim-greatdict.vim 的加载,直接导致了 iVim 崩溃https://github.com/terrychou/iVim/issues/153 不知道是 iVim 可用的内存不足还是 ZFVimIM 有 bug 。

ZSaberLv0 commented 4 years ago

emmm... 没想到你们能整出 80M 的词库...

这个应该是 ZFVimIM 的问题, 和 iVim 没啥关系

主要是为了加快词组搜索, 以及词频记录, 有一些冗余数据存在 vim 的 Dictionary 里面, 造成实际内存占用较大

后续我看看怎么优化这玩意儿

suliveevil commented 4 years ago

直接从 Emacs 那边的 pyim 搬过来的😝

ZSaberLv0 commented 4 years ago

简单测了下:

原词库: 6M 词库+索引 Dictionary: 120M + 140M 最简 List: 50M

6M 词库应该有方案能优化到 50M 左右内存占用, 不过 80M... 优化后估计也得 500~700M 左右

hao-lee commented 4 years ago

为啥这么吃内存

suliveevil commented 4 years ago

能不能像 pyim 一样直接正则匹配缓存中的数据而不是通过Python转换为词典啊?

ZSaberLv0 commented 4 years ago

vimim 是直接存储原始数据 (a 啊 阿), 然后匹配的时候逐行搜索, 所以要做预测会比较麻烦

ZFVimIM 额外存了个字母的映射关系, 比如

{
  'a' : {
    'i' : {
      ..
    },
  },
}

词库大了 Dictionary 也会非常多

后续考虑改成 26 个字母的索引好了, 但是 80M 的词库... emmm... 预计匹配时间得百毫秒计, 时间和空间总得舍弃一个

suliveevil commented 4 years ago

那个词库有很多超长拼音,比如公司全称……

ZSaberLv0 commented 4 years ago

简单尝试了下, 那个 80M 的词库加载时间大约 30 秒, 内存占用 170M 左右, 但是因为没存字母映射, 词库搜索效率感人, 10 个字母左右的输入就要大约 1秒的匹配时间

@suliveevil 这种巨大的词库有在其他场景里面使用过么? 性能如何?

suliveevil commented 4 years ago

没有,这是 Emacs 上的 pyim 输入法的数据,我还没用过 Emacs。

ZSaberLv0 commented 4 years ago

经过许久调教, 目前应该能应付各种巨大的词库了, 顺便还灵光一闪想到了如何添加异步的词库, 可以参见 https://github.com/ZSaberLv0/ZFVimIM_openapi

suliveevil commented 4 years ago

我试一下。