StarDict支持JavaScript和Firefox OS应用程序

时间:2013-08-12 15:38:42

标签: javascript data-structures firefox-os html5-apps

我为GoldenDict(www.goldendict.org,也可以参阅Google Play商店,以获取更多信息)的精神编写了一个字典应用程序,用于Firefox操作系统:http://tuxor1337.github.io/firedicthttps://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上直接为该项目做出贡献。否则,我很高兴听到您对上述问题的建议。

1 个答案:

答案 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
    }
    
  • 根据一个词,使用二进制搜索找到可能包含它的关键字块。

  • 切片关键字块并加载其中的所有键,过滤掉匹配的一个并获取其记录。
  • 使用二进制搜索找到包含单词记录的记录块。
  • 直接切片记录块并检索其记录(文本中的定义或ArrayBuffer中的资源)。

由于每个块仅包含大约2000个条目,因此在100ms内在100K~1M字典条目中查找单词的速度足够快,非常适合人类交互。 mdict-js仅解析文件头,它速度超快且内存使用率低。

以同样的方式,即使使用外卡,也可以检索给定短语的相邻单词列表。

请在此处查看我的在线演示:http://fengdh.github.io/mdict-js/ (您必须选择本地MDict字典:mdx +可选的mdd文件)