Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Работа с большими изображениями - Программирование Android
Изображение хранится в ресурсах приложения. Если оно больше размера экрана, то как его вписать при этом подстроится под размеры экрана? То...

Работа с большими объемами данных - Программирование Android
С вебсервиса скачиваеться JSON с 16ю МБ данными. Далее ее в StringBuilder, но программа валиться с ошибкой OutOfMemory (Ну в принципе...

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

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

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

MySQL Работа с большими данными - PHP БД
Здравствуйте. Так получилось, что сейчас надо написать сайт с большим количеством контента (таблица с контентом > 1GB). И я хочу что-бы вы...

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

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

Добавлено через 2 часа 12 минут
А не может получиться так, что память забивается не при парсинге, а при записи полученных данных, например, в SharedPreferences?
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
31.08.2016, 18:49 #9
ExFau$t, легко. OOM - штука такая, ей много не надо. В той теме я писал, что уже при скачивании всё роняется, ещё до распознавания. Поэтому использовал буферизацию. Кроме того, можно подумать насчёт вложенности объектов в JSON. Если там 10 уровней вложенности, а движок распознавателя - неоптимизированный, то, наверное, весь блок прочитает и свалится (предположение).
SharedPreferences имеет, если верить SO, предел в 2 GiB, а во внутренней памяти, наверное, нет такого объёма. Ну метров 100 - и обломись.
0
ExFau$t
357 / 343 / 66
Регистрация: 08.05.2012
Сообщений: 1,732
31.08.2016, 23:02  [ТС] #10
CoolMind, меня внутренняя память не очень беспокоит пока, а вот оп страдает...
0
CoolMind
419 / 402 / 65
Регистрация: 06.10.2012
Сообщений: 1,727
01.09.2016, 00:36 #11
ExFau$t, вам надо проследить, как растёт память. Естественно, с отладчиком поработать. Также посмотреть во время запуска график памяти (ну и в лог в нужных местах выводить всякие заметки). Может быть, где-то утечки есть.
0
ExFau$t
357 / 343 / 66
Регистрация: 08.05.2012
Сообщений: 1,732
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
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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