Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
ExFau$t
516 / 471 / 101
Регистрация: 08.05.2012
Сообщений: 2,368
#1

Работа с большими данными - Программирование Android

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

Добрый день.
Существуют ситуации, когда нужно подгрузить и распарсить что-то очень большое, ну, например, адреса Москвы. Если поставить парсить напрямую сразу всё, то, как правило, памяти телефона не хватит. Я делаю по частям в разных окнах, после окончания процесса перезапускаю окно, но бывают случаи, когда это слабо помогает, в процессе начинает глючить прогрессбар, затем гаснет экран и тп, вплоть до завершения приложения.
Интересует какие есть методики, хитрости и прочее для решения такого рода задач. Плюс ещё интересно, как выделяется память для приложения. Я брал для тестов телефон с 2гб оп чистый, а на приложение выделялось порядка 200мб при активном largeHeap.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
31.08.2016, 12:47
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Работа с большими данными (Программирование Android):

Работа с большими изображениями
Изображение хранится в ресурсах приложения. Если оно больше размера экрана, то...

Работа с большими объемами данных
С вебсервиса скачиваеться JSON с 16ю МБ данными. Далее ее в StringBuilder,...

Работа с данными Android приложение
Я создаю приложение по исторической тематике . И появилась проблема . Я...

Передача и работа с данными в диалоговых окнах
Всем доброго времени суток. Есть рабочая программа, но в неё небольшой...

Корректная работа с данными при переключении Activity
В моей программе пользователь может вызывать окно настроек, чтобы менять в нем...

Работа с большими данными
Здравствуйте. Так получилось, что сейчас надо написать сайт с большим...

11
Pablito
2644 / 2126 / 725
Регистрация: 12.05.2014
Сообщений: 7,433
Завершенные тесты: 1
31.08.2016, 12:54 #2
у этого чего-то очень большого наверное есть какой-то формат?

Добавлено через 52 секунды
если это xml то по идее XMLPullParser-у без разницы какой объем входящих данных
0
ExFau$t
516 / 471 / 101
Регистрация: 08.05.2012
Сообщений: 2,368
31.08.2016, 12:56  [ТС] #3
Ну обычно json. Загрузить его не проблема, а вот распарсить, чтобы хранить структурировано, проблематично.
0
Tester64
396 / 357 / 46
Регистрация: 22.05.2013
Сообщений: 2,518
31.08.2016, 13:16 #4
Цитата Сообщение от ExFau$t Посмотреть сообщение
Если поставить парсить напрямую сразу всё, то, как правило, памяти телефона не хватит.
1) Сложные/долгие обработки лучше запускать в сервисе и/или в отдельном потоке. Тогда это не будет завешивать активити и сможет работать даже в фоне.
2) Что парсим и чем? Если XML/JSON, то стандартными схемами (скорее всего) весь файл подгрузится в память, что для ОЧЕНЬ больших файлов не реально. В PHP были отдельные парсеры для гиганских XML файлов - может и в яве есть...
3) андроид МЕДЛЕННЫЙ! Может стоит распарсить "снаружи" (на сервере или на домашнем) и залить на телефон уже обработанное...
0
CoolMind
421 / 404 / 65
Регистрация: 06.10.2012
Сообщений: 1,732
31.08.2016, 13:16 #5
ExFau$t, добрый!
В своё время работал с файлами в несколько десятков мегабайт.
http://stackoverflow.com/questions/9...arge-json-file - здесь рекомендуют Gson с потоками (stream) и Jackson.
Парсинг большого объема JSON данных - здесь я колдовал с JsonReader и ручным разбором переменных.
0
ExFau$t
516 / 471 / 101
Регистрация: 08.05.2012
Сообщений: 2,368
31.08.2016, 13:38  [ТС] #6
Цитата Сообщение от Tester64 Посмотреть сообщение
1) Сложные/долгие обработки лучше запускать в сервисе и/или в отдельном потоке. Тогда это не будет завешивать активити и сможет работать даже в фоне.
Ну разумеется.
Цитата Сообщение от Tester64 Посмотреть сообщение
3) андроид МЕДЛЕННЫЙ! Может стоит распарсить "снаружи" (на сервере или на домашнем) и залить на телефон уже обработанное...
К сожалению, такой вариант не всегда возможен.
0
Pablito
2644 / 2126 / 725
Регистрация: 12.05.2014
Сообщений: 7,433
Завершенные тесты: 1
31.08.2016, 14:09 #7
вообще, мне кажеттся, что любое нормальное api должно поддерживать постраничную выдачу результатов
0
ExFau$t
516 / 471 / 101
Регистрация: 08.05.2012
Сообщений: 2,368
31.08.2016, 16:31  [ТС] #8
CoolMind, спасибо, как вариант загрузка json во внутреннюю память, а потом чтение из него, меня устраивает. А вот JsonReader, наверное, не подойдёт, много исключений в ходе парсинга, какие-то поля есть, какие-то нет (например, корпус дома, строение и тп для адресов).

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

Работа с большими данными
Не знаю к какому разделу относится данный вопрос, решил написать сюда. Есть...

Коллекции для работы с большими данными
Доброго времени суток! Столкнулся с такой проблемой: работаю с очень большим...

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

Сводные с большими обьемами данными не обновляются через Workbook_Open()
Здравствуйте, У меня есть одна проблема с обновлением сводных таблиц. Через...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru