我为GoldenDict(www.goldendict.org,也可以参阅Google Play商店,以获取更多信息)的精神编写了一个字典应用程序,用于Firefox操作系统:http://tuxor1337.github.io/firedict和https://marketplace.firefox.com/app/firedict
由于ffos的应用程序基于HTML,CSS和JavaScript(WebAPI等),我不得不从头开始编写所有内容。首先,我编写了一个基本库,用于在JavaScript中同步和异步访问StarDict词典:https://github.com/tuxor1337/stardict.js
虽然现在可以称应用程序稳定,但整体性能仍然有点迟缓。对于一些词典,我有一个近1,000,000个条目的单词列表!那太大了。索引需要很长时间(每个字典最多几分钟)和查找。目前,单词存储在IndexedDB对象库中。还有另一种选择吗?使用当前的解决方案(使用二进制搜索访问和插入单词),整体体验非常缓慢。 也许它会变得更快,如果IndexedDB有一些语言环境排序支持...... 实际上,我甚至没有将这些术语本身存储在数据库中,而只是将它们的偏移存储在* .syn / *中.idx文件。我希望能节省一些记忆。但当然,我无法在此配置中使用任何IDB排序功能......
在内存中进行排序可能不是最好的主意,因为现在由于某些设备上的OOM(例如ZTE Open),应用程序被内核杀死。一个包含超过500,000个条目的字典肯定会超过100 MB的内存。 (每个条目只有200字节,如果您认为关键字字符串是UTF-8,那么您将立即超过100 MB ...)
随意在GitHub上直接为该项目做出贡献。否则,我很高兴听到您对上述问题的建议。
答案 0 :(得分:2)
我正在研究一个类似于你的stardict项目的MDict解析器(https://github.com/fengdh/mdict-js)的纯Javascript实现。 MDict是另一种流行的字典格式,格式丰富(嵌入图像/音频/ css等),广泛支持window / linux / ios / android / windows手机。我有一些想法可以分享,并希望你可以将它用于改善stardict.js。
MDict字典文件(mdx / mdd)将关键字和记录分成(optionaly compressed)块,每个包含约2000个条目,并且还提供关键字块索引表和记录块索引表,以帮助快速查找。由于其紧凑的数据结构,我可以使用小的预加载索引表直接在字典文件上实现我的MDict解析器扫描,但不需要IndexDB 。
每个关键字块索引如下所示:
{num_entries: ..,
first_word: ..,
last_word: ..,
comp_size: .., // size in compression
decomp_size: .., // size after decompression
offset: .., // offset in mdx file
index: ..
}
在keyblock中,每个条目都是一对[keyword,offset]
每个记录块索引如下所示:
{comp_size: .., // size in compression
decomp_size: .., // size after decompression
}
根据一个词,使用二进制搜索找到可能包含它的关键字块。
由于每个块仅包含大约2000个条目,因此在100ms内在100K~1M字典条目中查找单词的速度足够快,非常适合人类交互。 mdict-js仅解析文件头,它速度超快且内存使用率低。
以同样的方式,即使使用外卡,也可以检索给定短语的相邻单词列表。
请在此处查看我的在线演示:http://fengdh.github.io/mdict-js/ (您必须选择本地MDict字典:mdx +可选的mdd文件)