Могу ли я сэкономить место в своих индексах Mongodb, преобразовав строки ASCII в байты?

У меня есть много объектов с кодом языка в качестве ключевого поля. Поскольку и Java, и Mongodb изначально используют UTF-8, а коды языков ASCII, кажется, что они должны занимать 1 байт на символ плюс терминатор \0. Таким образом, код языка «en» должен занимать всего 3 байта в объекте BSON и в индексе.

Это правильно? Мне интересно, сохраняю ли я что-нибудь, преобразовывая свои поля в массив байтов, например:

byte[] lcBytes = langCode.getBytes("ISO-8859-1");

прежде чем сохранять их в Mongodb с помощью драйвера Java?


person Nic Cottrell    schedule 18.06.2012    source источник


Ответы (1)


Согласно спецификации bson, это не имеет значения:

string  ::= int32 (byte*) "\x00"
binary  ::= int32 subtype (byte*)

Другими словами, строка завершается нулем (следовательно, теряется один байт), в то время как двоичному файлу требуется однобайтовое поле подтипа.

Конечно, идеально подходящий набор символов может быть более эффективным, поскольку сам массив байтов может быть меньше (например, не требуется три байта для символа, который вам нужен очень часто, а только один). Опять же, я вряд ли думаю, что это стоит хлопот, потому что это делает невозможным использование регулярных выражений, map/reduce, js-функций и т. д. Возможно, для очень сложных кодировок, но 8859-1 не слишком особенный.

В качестве примечания: имейте в виду, что размер индекса ограничен примерно 1 КБ, поэтому вы не можете выбрасывать очень длинные строки в индекс (и это не очень хорошая идея с точки зрения производительности).

Если вам нужно запрашивать только по равенству, возможно, вы могли бы вместо этого выбрать хэш? Если вам нужно хранить очень большие строки (неиндексированные), алгоритм сжатия может быть хорошей идеей.

person mnemosyn    schedule 19.06.2012