6

В моем приложении для Android необходимо получить изображения с сервера и кэшировать их в кучу памяти.Один символ в Base64String содержит сколько байтов? 1, 2 или более

При получении запроса сервер сначала кодирует byte[] в Base64String и возвращает эту строку. И во время рендеринга в ImageView приложение для Android расшифровывает Base64String назад на byte[], создает Bitmap и помещает его на ImageView.

Как все в кеше, есть вероятность, что приложение выйдет из памяти в какой-то момент и критически критически.

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

Bitmap был переработан после того, как пользователь отошел от изображения, поэтому Bitmap эффективно не удерживает память, пока мы уезжаем.

В конкретном тесте я загружаю 55 изображений, а моя куча растет от 16 MB до 42 MB. Это означает, что 55 изображений занимают 26 MB. После того, как я очистил их все, куча сжимается до 16 MB.

Но, когда я беру кумулятивную сумму длин всех Base64String, она приходит к 11983840. И если я считаю, один символ, как 1 byte11983840 bytes делает 11.4 MB

Проблема заключается в том, накопленная сумма длин Base64String является единственной доступной мерой мне, что помогает дать пользователю знать, сколько памяти может быть освобожден от его выбора ,

Я также прочитал следующий вопрос, который упоминает, что для каждого 3 Bytes исходных данных Base64String будет иметь номер 4 Characters.

Base64 length calculation?

Вопрос заключается в том, один символ в Base64String имеет сколько байт? 1, 2 или более

Если 1 character является 1 byte, и в моем тесте куча увеличивается и уменьшается на 26 MB. Тогда почему суммарная сумма длин Base64String составляет только 11,4 МБ?

Обновлено

enter image description here

Это означает, что 1 Byte на символ.

enter image description here

по умолчанию CharacterSet здесь UTF-8

+0

см этой ссылки http://stackoverflow.com/questions/13378815/base64-length-расчет? Lq = 1 –

+0

Я уже ссылался на эту ссылку и, следовательно, сохранил ее как часть моего вопроса. Проблема в ссылке и совсем другая. –

ответ

2

Давайте начнем с самого начала ...

Base64 является формат кодирования на основании набора из 64 символов - каждый символ стоит 6 бит данных (2^6 = 64). Поэтому при преобразовании каждому 8-битовому байту ввода требуется (8/6) = 1.333333 ... символов.

Но поскольку компьютеры хранят только целые байты, проще сказать, что для каждых 3 байтов (3 * 8 = 24 бит) ввода создается 4 базовых 64 символа (4 * 6 = 24 бит).

Теперь вы говорите, что ваша общая длина строки-64 составляет 11 миллионов символов. В Java строки хранятся в 16-разрядном формате Unicode: 1 символ = 2 байта.

Таким образом, 11 миллионов символов будут использовать более 20 МБ только в необработанных символьных данных. Это, в сочетании с объектами, переменными и другим состоянием, необходимым для хранения информации, означает, что 26 МБ является разумным значением для объема данных, которые вы используете.

Так общее правило, которое вы можете использовать для оценки использования памяти (((input_data_in_bytes * 4/3) * 2) + несколько MB)

+0

Спасибо за ответ. Это действительно приятное объяснение. Но вопрос все еще остается открытым, потому что в моем последнем нахождении я видел символ по умолчанию как UTF-8. Пожалуйста, проверьте раздел «Обновлено» в вопросе. –

+1

@Wayofhope Думаю, вы в замешательстве. Значение 'defaultCharset()' представляет кодировку, используемую, когда ваша Java-программа * взаимодействует с вашей операционной системой * - это связано с данными кодирования при чтении и записи из потоков и других операций ввода-вывода. Это не имеет никакого отношения к тому, как символы хранятся в стиле строки Java, который всегда является 16-разрядным юникодом. Как описано в http://docs.oracle.com/javase/7/docs/api/java/lang/String.html * Строка представляет строку в формате UTF-16 ... * – adelphus

+0

Привет, adelphus, спасибо за объяснение. Возможно, я ошибаюсь, но просто хочу копаться в глубине. Для строки «Привет», почему «Hello» .getBytes(). Length возвращает мне 5? –