← На главную

Решение в Rust с FST автоматами урезало проект до 10 МБ

10.05.2026 10:33 · hackernews

Автор проекта Taskusanakirja, известного как tsk, столкнулся с классической проблемой: как уместить огромный словарь финского языка в один небольшой исполняемый файл. Первые версии на Go отлично справлялись с базовым поиском по префиксам, используя структуру данных под названием trie. Эта схема работала чудесно на начальных этапах, позволяя загружать программу размером около 60 МБ. Но финский язык — это сложная агглютинативная структура, где от одного корня слова может образовываться более сотни окончаний. Обычные триевые деревья не смогли уместить около 40–60 миллионов форм слов, не раздув память до неприемлемых размеров. Сначала авторы решили хранить сложные формы в отдельной базе данных SQLite с расширением Full Text Search. Это решение работало без задержек, но требовало скачивания гигабайта данных один раз при установке, что не устроило разработчика.

Читатель задумался о переподготовке проекта на Rust. Он нашел вдохновение в записи инженера Бёрн Сьюси, автора популярной утилиты ripgrep, который успешно применил автоматы конечного состояния для компактного хранения миллиардов ключей. Эти автоматы, называемые FST, позволяют эффективно хранить не только начала, но и концы строк, что идеально подошло для финского языка, где часто повторяются одни и те же суффиксы. Используя эту технологию в языке Rust, автор удалил лишние данные из базы и сжал их. В результате общий размер приложения упал с гигабайта до 10 МБ. Это означало 300-кратное сокращение объема по сравнению с исходным вариантом. Теперь вся программа, включая библиотеки, весит около 20 МБ, что в три раза меньше, чем версия на Go. Решение позволило упаковать всю логику в один небольшой бинарник, что сделало инструмент доступным даже для старых ноутбуков студентов. Автор также признает, что использование базы данных было временным, но необходимым шагом, который дал время на поиск более эффективного подхода.

Читать оригинал →