StarDict支持JavaScript和Firefox操作系统应用程序



我本着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对象存储中。还有其他选择吗?使用当前的解决方案(使用二进制搜索访问和插入单词),整体体验相当缓慢

如果IndexedDB支持一些区域设置排序,也许它会变得更快实际上,我甚至没有将术语本身存储在DB中,而是将它们的偏移量存储在*.syn/*.idx文件中。我希望这样做能保存一些记忆。但当然,我不能在这种配置中使用任何IDB排序功能。。。

也许在内存中进行排序不是最好的主意,因为现在由于某些设备上的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文件)

相关内容

  • 没有找到相关文章

最新更新