我本着GoldenDict(www.GoldenDict.org,更多信息请参阅Google Play Store)的精神为Firefox OS编写了一个词典应用程序:http://tuxor1337.github.io/firedict和https://marketplace.firefox.com/app/firedict
由于ffos的应用程序是基于HTML、CSS和JavaScript(WebAPI等)的,所以我必须从头开始编写所有内容。起初,我用JavaScript编写了一个用于同步和异步访问StarDict字典的基本库:https://github.com/tuxor1337/stardict.js
尽管该应用程序目前可以称为稳定,但整体性能仍有点低迷。对于一些词典,我有一个几乎有1000000个词条的单词列表!太棒了。索引需要很长的时间(每个字典最多需要几分钟)和查找。目前,这些单词存储在IndexedDB对象存储中。还有其他选择吗?使用当前的解决方案(使用二进制搜索访问和插入单词),整体体验相当缓慢
也许在内存中进行排序不是最好的主意,因为现在由于某些设备上的OOM(例如中兴Open),应用程序被内核杀死。一本超过500000个词条的词典的内存肯定会超过100MB。(每个条目只有200字节,如果你假设关键字字符串是UTF-8,你会立即超过100 MB…)
欢迎在GitHub上直接为项目做出贡献。否则,我很乐意听取你对上述问题的建议。
我正在开发MDict解析器的纯Javascript实现(https://github.com/fengdh/mdict-js)向您的标准化项目致敬。MDict是另一种流行的字典格式,具有丰富的格式(嵌入式图像/音频/css等),在windows/linux/ios/android/windows phone上得到广泛支持。我有一些想法要分享,希望你们将来能应用它来改进stadict.js。
MDict字典文件(mdx/mdd)将关键字和记录划分为(可选压缩)块,每个块包含大约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中,每个条目都是一对[关键字,偏移量]
-
每个记录块索引看起来像:
{comp_size: .., // size in compression decomp_size: .., // size after decompression }
-
给定一个单词,使用二进制搜索来定位可能包含它的关键字块
- 对关键字块进行切片并加载其中的所有关键字,筛选出匹配的关键字并获取其记录offset
- 使用二进制搜索来定位包含单词记录的记录块
- 对记录块进行切片并直接检索其记录(ArrayBuffer中文本或资源中的定义)
由于每个块只包含大约2000个条目,因此在100ms内在100K~1M个字典条目中查找单词的速度足够快,这对于人类交互来说是相当不错的价值。mdict-js只解析文件头,速度极快,内存使用率低。
同样,即使使用通配符,也可以检索给定短语的相邻单词列表。
请在这里查看我的在线演示:http://fengdh.github.io/mdict-js/(您必须选择一个本地MDict字典:一个mdx+可选的mdd文件)