Android OutOfMemoryError - Загрузка файла JSON - PullRequest
1 голос
/ 22 мая 2010

Приложению, над которым я работаю, необходимо прочитать файл JSON, размер которого может быть от 1,5 до 3 МБ. Кажется, что нет проблем с открытием файла и преобразованием данных в строку, но когда он пытается преобразовать строку в JSONArray, генерируются ошибки OutOfMemoryErrors. Исключения выглядят примерно так:

E/dalvikvm-heap( 5307): Out of memory on a 280-byte allocation.
W/dalvikvm( 5307): Exception thrown (Ljava/lang/OutOfMemoryError;) while throwing internal exception (Ljava/lang/OutOfMemoryError;)

Одна странная вещь в этом состоит в том, что сбой происходит только каждый 2-й или 3-й раз, когда приложение запускается, поэтому я полагаю, что память, используемая приложением, не собирается для мусора при каждом закрытии приложения.

Буду очень признателен за понимание того, как я могу обойти эту проблему. Я открыт для идеи загрузки файла порциями, но я не совсем уверен, что лучший подход для такой задачи.

Спасибо

Ответы [ 3 ]

3 голосов
/ 22 мая 2010

Когда вы говорите «2-й или 3-й запуск», вы имеете в виду каждый раз, когда начинаете со свежим эмулятором? или вы имеете в виду оставить заявку и вернуться? (например, нажав home или вызывая finalize ())

Если вы ссылаетесь на выход из приложения и его повторный запуск:

если вы не установили android: launchMode в своем манифесте, чтобы определить действие как singleInstance или singleTask, то каждый раз при запуске приложения создается новое действие и добавляется в стек действий. Вы можете легко запустить несколько копий своей деятельности в процессе приложения, потребляя много памяти.

Если это произойдет, 2-й запуск, вы все еще используете много памяти и должны сломать его больше.

2 голосов
/ 22 мая 2010

Одна странная вещь в этом состоит в том, что сбой происходит только каждый 2-й или 3-й раз, когда приложение запускается, поэтому я полагаю, что память, используемая приложением, не собирается для мусора при каждом закрытии приложения.

Это, безусловно, возможно, и если это так, то, вероятно, это связано с утечкой памяти, которая может быть прослежена до того, что делает ваше приложение. Я думаю, что вы должны сосредоточить свои первоначальные усилия на исследовании этого аспекта ... вместо того, чтобы загружать файл порциями. (Я не знаком с цепочкой инструментов Android, но уверен, что она включает профилировщики использования памяти или анализаторы дампов памяти.)

EDIT

В ответ на ваш дополнительный комментарий тот факт, что он работает 2 раза в 3, говорит о том, что ваше приложение должно работать примерно как есть. По общему признанию, у вас нет большой свободы действий, если входной файл становится больше.

Пара идей:

  • Вместо чтения файла в строку и запуска анализатора JSON в строке, используйте анализатор, который может читать непосредственно из потока. Вашему текущему решению требуется место для двух полных копий данных в памяти, пока вы выполняете анализ.

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

Я не уверен, что читать JSON-файл в «чанках» - это хорошая идея. Это может создать проблемы для синтаксического анализа JSON ... в зависимости от того, что именно вы подразумеваете под чтением блоков.

РЕДАКТИРОВАТЬ 2

Возможно, вам нужен синтаксический анализатор JSON типа "SAX like"; например http://code.google.com/p/async-json-library/

0 голосов
/ 30 ноября 2012

Попробуйте эффективно использовать анализ данных JSON на Android, используя JsonReader. Это как SAX-разбор для XML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...