Поддержка StarDict для JavaScript и приложения для Firefox OS
Я написал приложение-словарь в духе GoldenDict (www.goldendict.org, см. Также Google Play Store для получения дополнительной информации) для ОС Firefox: http://tuxor1337.github.io/firedict и https://marketplace.firefox.com/app/firedict
Поскольку приложения для ffos основаны на HTML, CSS и JavaScript (WebAPI и т. Д.), Мне пришлось писать все с нуля. Сначала я написал базовую библиотеку для синхронного и асинхронного доступа к словарям StarDict в JavaScript: https://github.com/tuxor1337/stardict.js
Хотя приложение уже можно назвать стабильным, общая производительность все еще немного вялая. Для некоторых словарей у меня есть список слов из почти 1000 000 статей! Это огромно. Индексирование занимает очень много времени (до нескольких минут на словарь), а также поиск. На данный момент слова хранятся в хранилище объектов IndexedDB. Есть ли другая альтернатива? С текущим решением (слова, к которым обращаются и вставляют с использованием бинарного поиска), общее восприятие довольно медленное. Может быть, это стало бы быстрее, если бы имелась некоторая поддержка сортировки локали IndexedDB... На самом деле, я даже не храню сами термины в БД, а только их смещения в файле *.syn/*. Idx. Я надеюсь сохранить память, делая это. Но, конечно, я не могу использовать какие-либо функции сортировки IDB с этой конфигурацией...
Возможно, это не лучшая идея для сортировки в памяти, потому что теперь приложение убито ядром из-за OOM на некоторых устройствах (например, ZTE Open). Словарь с более чем 500 000 записей определенно превысит 100 МБ в памяти. (Это только 200 байт на запись, и если вы предполагаете, что строки ключевых слов - UTF-8, вы сразу превысите 100 МБ...)
Не стесняйтесь вносить непосредственный вклад в проект на GitHub. В противном случае, я был бы рад услышать ваш совет по вышеуказанным вопросам.
1 ответ
Я работаю над реализацией синтаксического анализатора MDict ( https://github.com/fengdh/mdict-js) на чистом Javascript, аналогичного вашему проекту stardict. MDict - это еще один популярный формат словаря с расширенным форматом (внедренное изображение / аудио / CSS и т. Д.), Который широко поддерживается в Windows / Linux/ IOS / Android / Windows Phone. У меня есть несколько идей, и я хотел бы, чтобы вы применили их для улучшения 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 }
По заданному слову используйте бинарный поиск, чтобы найти блок ключевых слов, который может содержать его.
- Разделите блок ключевого слова и загрузите все ключи в нем, отфильтруйте соответствующий и получите его запись ofset.
- Используйте бинарный поиск, чтобы найти блок записи, содержащий запись слова.
- Разделите блок записи и извлеките его запись (определение в тексте или ресурс в ArrayBuffer) напрямую.
Поскольку каждый блок содержит только около 2000 записей, достаточно быстро найти слово среди 100K~1M словарных статей за 100 мс, что является вполне приемлемым значением для взаимодействия с человеком. mdict-js анализирует только заголовок файла, он очень быстрый и использует мало памяти.
Таким же образом, можно получить список соседних слов для данной фразы, даже с подстановочными знаками.
Пожалуйста, ознакомьтесь с моей онлайн-демонстрацией здесь: http://fengdh.github.io/mdict-js/(Вы должны выбрать локальный словарь MDict: mdx + необязательный файл mdd)