我本着 GoldenDict(www.goldendict.org,更多信息参见 Google Play 商店)的精神为 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
虽然目前这款应用可以称得上是稳定的,但整体性能还是有点呆滞。对于某些词典,我有一个包含近 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: ..
}
{comp_size: .., // size in compression
decomp_size: .., // size after decompression
}
由于每个块仅包含大约 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/