Оптимальный способ обработки больших двоичных данных в Android? - PullRequest
0 голосов
/ 19 октября 2019

В моем приложении есть долгосрочное задание (до 10-15 минут), в течение которого приложение передает большой объем данных (до 16 МБ) с устройства BLE.

ТекущийРеализация использует RxAndroidBle для асинхронного выполнения передачи, что происходит с помощью опции характеристики NOTIFY BLE - приложение подписывается на характеристику и запрашивает данные для передачи, и устройство BLE начинает отправлять пакеты, содержащие данные. Благодаря решению NOTIFY (сервер, в нашем случае устройство BLE, будет повторять пакеты, которые не получают подтверждение о том, что оно было получено), мне не нужно заботиться ни о чем, кроме постоянного хранения полученных пакетов.

На данный момент это решается путем увеличения обычного ByteArray (проект находится в Котлине) через

data += received

Однако во время такой передачи около 6 МБОтметим, что доступная оперативная память для приложения падает ниже 20% в соответствии с журналами GC и постепенно уменьшается примерно до 10-12% к моменту передачи 8 МБ. Я не пробовал с более крупной партией, поскольку что-то большее довольно редко встречается на данном устройстве, но это может произойти.

Я пытался заменить ByteArray на предварительно выделенный ByteBuffer, однако в соответствиисообщения GC, это не значительное улучшение.

Есть что-нибудь, что можно попробовать здесь, чтобы оптимизировать назначение данных, или есть вероятность, что причина падения памяти находится где-то еще?

...