Будет ли кодирование строки занимать меньше памяти? - PullRequest
0 голосов
/ 10 февраля 2019

Я запутался в теме пространства памяти.Допустим, у нас есть следующая строка:

String from = "Hello I am from Chicago";

Если я закодирую ее с использованием кодирования Хаффмана, LZ4 или GZip и т. Д. (Алгоритм кодирования на данном этапе не имеет значения):

String encodedFrom= encodingLibrary.encode(from);

Теперь объем памяти, который будет удерживать encodedName, будет меньше того, что занял бы name?

Я запутался, потому что, когда мы храним строки, даже если их меньшебиты, ВМ (или сама ОС, или что-то) добавили бы заполнение до конца, чтобы завершить байт.Что-то вроде того.Таким образом, в конце дня объем памяти (не потребление) одинаков как для кодированной, так и для un -кодированной строки.Правильно ли я так думаю?

2-й вопрос, связанный с первым, на самом деле я хочу закодировать сотни тысяч записей и сохранить их в кэше Redis.как это отразится, если мы исключим время, необходимое для сжатия / распаковки и факторы потребления памяти?Закодированная строка будет занимать меньше места в кэше Redis?

Цените любую помощь.

1 Ответ

0 голосов
/ 10 февраля 2019

Сжать строку и затем сохранить сжатый результат обратно в другой строке - очень плохая идея.

Строки, как правило, представляют собой последовательности символов.Они должны содержать буквы, знаки препинания, пробелы и тому подобное.Любой, кто обнаружит, что вы используете их для хранения двоичных данных, будет зол на вас, потому что это очень необычно.

Если вы когда-нибудь захотите сжать строки, будьте максимально честны и сохраняйте сжатые данные в байтовом массиве.Массивы байтов являются универсальными контейнерами, и в них следует ожидать хранения произвольных данных.

Вернуться к основному вопросу.В Java String - это, в основном, char[], что означает, что каждый символ потребляет 16 бит (если вы имеете дело с простым английским или другими символами из базовой многоязычной плоскости ).

Поскольку все ваши символы являются ASCII, каждый из них может быть закодирован с использованием 7 битов.Добавьте еще один бит в самом начале, говоря «остальная часть этой строки только для ASCII», вы получите простую схему сжатия и 1 + 23 * 7 битов, что составляет 21 байт.Конечно, в этом случае в последнем байте есть 6 битов заполнения, но по сравнению с 2 * 23 байтами для хранения строки как есть, это уже хорошо.

(Я просто забыл: начиная с Java 9Строки, содержащие только ASCII, хранятся особым образом, который использует только 8 бит на символ вместо 16. Таким образом, предложенная выше схема сжатия будет действовать только до Java 8.)

При использовании Redis для хранения данныхимейте в виду, что он хранит все данные в оперативной памяти и вылетает, если не может выделить дополнительную оперативную память.(Насколько я помню, это было около 5 лет назад.) Поэтому, если вы уже можете оценить, что данные Redis становятся больше нескольких гигабайт, лучше выберите другую библиотеку хранения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...