我本着 GoldenDict(www.goldendict.org,更多信息参见 Google Play 商店)的精神为 Firefox OS 编写了一个字典应用程序: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 排序功能......

也许在内存中进行排序不是最好的主意,因为现在由于某些设备(例如 ZTE Open)上的 OOM,应用程序被内核杀死了。超过 500,000 个条目的字典在内存中肯定会超过 100 MB。 (每个条目只有 200 字节,如果您假设关键字字符串是 UTF-8,您将立即超过 100 MB...)

随意直接为 GitHub 上的项目做出贡献。否则,我很乐意听取您对上述问题的建议。

最佳答案

我正在研究 MDict 解析器 (https://github.com/fengdh/mdict-js) 的纯 Javascript 实现,类似于您的 stardict 项目。 MDict 是另一种流行的字典格式,具有丰富的格式(嵌入图像/音频/css 等),在window/linux/ios/android/windows 手机上得到广泛支持。我有一些想法要分享,希望你能在 future 应用它来改进 stardict.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中,每个条目都是一对[keyword, offset]
  • 每个记录块索引看起来像:
    {comp_size: ..,    // size in compression
     decomp_size: ..,  // size after decompression
    }
    
  • 给定一个词,使用二分搜索来定位可能包含它的关键字块。
  • 对关键字块进行切片并加载其中的所有键,过滤出匹配的一个并获取其记录偏移量。
  • 使用二分查找定位包含单词记录的记录块。
  • 对记录块进行切片并直接检索其记录(文本中的定义或 ArrayBuffer 中的资源)。

  • 由于每个块仅包含大约 2000 个条目,因此在 100 毫秒内在 100K~1M 字典条目中查找单词足够快,对于人机交互来说非常有值(value)。 mdict-js 只解析文件头,速度超快,内存占用低。

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

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

    关于javascript - StarDict 支持 JavaScript 和 Firefox OS 应用程序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18191113/

    10-09 22:11