Вам следует ознакомиться с тем, как Hash
хранится в памяти. Есть хороший пост в блоге об этом здесь .
Если ваш словарь содержит только слова, а не фразы, у вас должно быть около 90 МБ данных на язык (при условии, что 4 байта для справки и средняя длина слова 5 символов), то есть всего около 1 ГБ данных, способ хэширования и строки работа потребует гораздо больше памяти, чем каждая, каждая строка является объектом, который содержит информацию, такую как место в памяти, кодировка символов, длина и так далее. Таким образом, использование Ruby в десять раз больше по сравнению с обычными текстовыми данными - неплохое достижение.
Как и предполагали другие, лучшим вариантом будет сохранение этих данных в базе данных или хранилище значений ключей, таких как Redis, но вы отклонили этот вариант из-за проблем с производительностью (на обычном ноутбуке Redis может работать более 500 000 GET в секунду).
Другим вариантом сокращения потребления памяти будет сокращение использования хешей и использование индексов массива. Ваш переводчик может выглядеть так:
TRANSLATIONS = {
"hello" => ['bonjour', 'hola'],
"thanks" => ['merci', 'gracias']
}
LANGUAGES = { french: 0, spanish: 1 }
def translate(english_word, language)
TRANSLATIONS.dig(english_word, LANGUAGES[language])
end
translate('hello', :spanish)
=> 'hola'
Кроме того, я не могу не отметить, что созданный таким образом переводчик не дает результата, который полезен в любом контексте. Вы не можете перевести достаточно, просто заменив каждое слово переводом слова с другого языка. Также вам придется хранить пары для каждого грамматического падежа: «спать, спать, спать, спать, спать, спать, спать, ...», чтобы даже найти подходящее слово.
Кроме того, Оксфордский словарь английского языка содержит только 171 476 слов.