词典软件查词为何如此之快?不需要每次读入全部MDX文件吗?

很多人象我一样安装了几百部MDX词库且同时打开查询单词。那么每次查询单词,词典软件都需要将打开的词库MDX/MDD文件整体读入内存吗?貌似不是这样的。

这些同时打开的MDX的文件大小加起来动辄上GB甚至几十GB,而即便是读写速度仅有每秒一百多MB的机械硬盘上词典软件也可以做到在短短的几秒钟将这些词的释义从MDX中检索出来。而词典软件是如何做到的呢?GoldenDict在装入新词库的时候有一个短暂的扫描过程,这个过程中它在干什么?而且GoldenDict还可以做更长时间(比如数小时甚至几十小时)的词库全文索引,这个过程中它背后又在干什么这个索引的具体数据结构是怎样的?欧路貌似不会去做全文索引但它为什么检索也这么快?

看起来,关键的技术问题似乎是 ——“Windows操作系统和安卓操作系统,是否支持读取硬盘上文件的指定字节处的内容而无需事先将整个文件全部读入内存?”
如果这个问题的答案是肯定的,那么这些词典软件是否事先都储存了一张索引表,上面有每部词库的词头和该词头的释义在MDX文件中的地址?

3 个赞

GoldenDict的全文检索是本地的,索引需要时间;欧路的全文检索是在云端,欧路会把你的词典文件上传到他们的服务器上,如果服务器上已经存在了就不需要上传了。

是的,可以直接读取文件的任意位置的内容。

是的。

1 个赞

很有价值的问题。

索引也是一种文件,他的作用就是加速搜索(随机查找)。针对全文索引,由于大多数词典格式并不带全文索引,所以不同的词典软件对于全文搜索有不同的实现方式:GoldenDict 是生成索引文件,有的软件是暴力查找所有词条。别担心,暴力查找所有词条对于计算机来说并不是一个很困难的任务,并且可以很快完成,不过比起查找索引,还是慢太多了。

读取任意偏移量的文件内容这是现代操作系统的基本能力。

mdx在编译的时候就在文件头写了相应的词条偏移量,所以快速读入打开词条并不麻烦。
至于全文索引,这个是由各个软件自己维护的一套新的“索引”不仅仅是词条词头的索引,你可以理解为它把每个单词出现的所有位置都给暴力搜索了一边,做了一个完整的索引。

1 个赞

与苹果的"spotlight"一样,先制作索引,后读取索引。不过词典软件的效率比之快得多。。

1 个帖子被合并到现有话题中:各位,为什么The Little Dict在goldenDict给全文进行索引时会这么慢呢?