Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
#1

Работа с большими данными - Android

31.08.2016, 12:47. Просмотров 221. Ответов 11
Метки нет (Все метки)

Добрый день.
Существуют ситуации, когда нужно подгрузить и распарсить что-то очень большое, ну, например, адреса Москвы. Если поставить парсить напрямую сразу всё, то, как правило, памяти телефона не хватит. Я делаю по частям в разных окнах, после окончания процесса перезапускаю окно, но бывают случаи, когда это слабо помогает, в процессе начинает глючить прогрессбар, затем гаснет экран и тп, вплоть до завершения приложения.
Интересует какие есть методики, хитрости и прочее для решения такого рода задач. Плюс ещё интересно, как выделяется память для приложения. Я брал для тестов телефон с 2гб оп чистый, а на приложение выделялось порядка 200мб при активном largeHeap.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Паблито
резкий
1959 / 1694 / 525
Регистрация: 12.05.2014
Сообщений: 6,044
Завершенные тесты: 1
31.08.2016, 12:54     Работа с большими данными #2
у этого чего-то очень большого наверное есть какой-то формат?

Добавлено через 52 секунды
если это xml то по идее XMLPullParser-у без разницы какой объем входящих данных
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
31.08.2016, 12:56  [ТС]     Работа с большими данными #3
Ну обычно json. Загрузить его не проблема, а вот распарсить, чтобы хранить структурировано, проблематично.
Tester64
395 / 356 / 43
Регистрация: 22.05.2013
Сообщений: 2,502
31.08.2016, 13:16     Работа с большими данными #4
Цитата Сообщение от ExFau$t Посмотреть сообщение
Если поставить парсить напрямую сразу всё, то, как правило, памяти телефона не хватит.
1) Сложные/долгие обработки лучше запускать в сервисе и/или в отдельном потоке. Тогда это не будет завешивать активити и сможет работать даже в фоне.
2) Что парсим и чем? Если XML/JSON, то стандартными схемами (скорее всего) весь файл подгрузится в память, что для ОЧЕНЬ больших файлов не реально. В PHP были отдельные парсеры для гиганских XML файлов - может и в яве есть...
3) андроид МЕДЛЕННЫЙ! Может стоит распарсить "снаружи" (на сервере или на домашнем) и залить на телефон уже обработанное...
CoolMind
417 / 400 / 65
Регистрация: 06.10.2012
Сообщений: 1,713
31.08.2016, 13:16     Работа с большими данными #5
ExFau$t, добрый!
В своё время работал с файлами в несколько десятков мегабайт.
http://stackoverflow.com/questions/9...arge-json-file - здесь рекомендуют Gson с потоками (stream) и Jackson.
Парсинг большого объема JSON данных - здесь я колдовал с JsonReader и ручным разбором переменных.
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
31.08.2016, 13:38  [ТС]     Работа с большими данными #6
Цитата Сообщение от Tester64 Посмотреть сообщение
1) Сложные/долгие обработки лучше запускать в сервисе и/или в отдельном потоке. Тогда это не будет завешивать активити и сможет работать даже в фоне.
Ну разумеется.
Цитата Сообщение от Tester64 Посмотреть сообщение
3) андроид МЕДЛЕННЫЙ! Может стоит распарсить "снаружи" (на сервере или на домашнем) и залить на телефон уже обработанное...
К сожалению, такой вариант не всегда возможен.
Паблито
резкий
1959 / 1694 / 525
Регистрация: 12.05.2014
Сообщений: 6,044
Завершенные тесты: 1
31.08.2016, 14:09     Работа с большими данными #7
вообще, мне кажеттся, что любое нормальное api должно поддерживать постраничную выдачу результатов
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
31.08.2016, 16:31  [ТС]     Работа с большими данными #8
CoolMind, спасибо, как вариант загрузка json во внутреннюю память, а потом чтение из него, меня устраивает. А вот JsonReader, наверное, не подойдёт, много исключений в ходе парсинга, какие-то поля есть, какие-то нет (например, корпус дома, строение и тп для адресов).

Добавлено через 2 часа 12 минут
А не может получиться так, что память забивается не при парсинге, а при записи полученных данных, например, в SharedPreferences?
CoolMind
417 / 400 / 65
Регистрация: 06.10.2012
Сообщений: 1,713
31.08.2016, 18:49     Работа с большими данными #9
ExFau$t, легко. OOM - штука такая, ей много не надо. В той теме я писал, что уже при скачивании всё роняется, ещё до распознавания. Поэтому использовал буферизацию. Кроме того, можно подумать насчёт вложенности объектов в JSON. Если там 10 уровней вложенности, а движок распознавателя - неоптимизированный, то, наверное, весь блок прочитает и свалится (предположение).
SharedPreferences имеет, если верить SO, предел в 2 GiB, а во внутренней памяти, наверное, нет такого объёма. Ну метров 100 - и обломись.
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
31.08.2016, 23:02  [ТС]     Работа с большими данными #10
CoolMind, меня внутренняя память не очень беспокоит пока, а вот оп страдает...
CoolMind
417 / 400 / 65
Регистрация: 06.10.2012
Сообщений: 1,713
01.09.2016, 00:36     Работа с большими данными #11
ExFau$t, вам надо проследить, как растёт память. Естественно, с отладчиком поработать. Также посмотреть во время запуска график памяти (ну и в лог в нужных местах выводить всякие заметки). Может быть, где-то утечки есть.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.09.2016, 09:42     Работа с большими данными
Еще ссылки по теме:

Работа с большими изображениями Android
Работа с большими объемами данных Android
Оперирование данными из textview Android
Android Обмен данными между Activity
Вернуться во фрагмент с данными? Android

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ExFau$t
124 / 107 / 14
Регистрация: 08.05.2012
Сообщений: 732
01.09.2016, 09:42  [ТС]     Работа с большими данными #12
CoolMind, да кроме парсера нету больше ничего, да и потом это не си, чтобы память очищать. Происходит так, если закомментировать - порядок, если не парсить, а записать json.toString() - тоже норм, а вот начинаю брать конкретные поля разбирать и засовывать куда-нибудь в свои файлики, тут работает, потом виснет, потом вылет. Ничего лишнего в коне нету, получил getString - записал setString.
Yandex
Объявления
01.09.2016, 09:42     Работа с большими данными
Ответ Создать тему
Опции темы

Текущее время: 03:47. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru