Использование SAX-парсера в Android - проблема OutOfMemory - PullRequest
3 голосов
/ 15 марта 2010

Я уже некоторое время использую синтаксический анализатор SAX для получения данных из различных XML, но сегодня я бьюсь над новой проблемой с XML-разметкой (по сравнению с предыдущими. Здесь около 12 тыс. Строк) св нем много повторяющихся предметов.Чаще всего предметы являются частью блока:

  <content>

  <item lbl="blabla">
    <item lbl="blabla"/>
    <item lbl="blabla"/>
  </item>

  <item lbl="blabla">
    <item lbl="blabla"/>
    <item lbl="blabla"/>
    <item lbl="blabla"/>
    <item lbl="blabla"/>
    <item lbl="blabla"/>
    <item lbl="blabla"/>
  </item>
</content>

Конечно, часть блабла меняется ... Но я бы хотел сохранить структуру предметов (это названия и субтитры),И для этого я добавляю каждую блаблу с начальным и конечным тегом <itemx>blabla</itemx>, где x - это позиция в дереве элементов (1, 2, 3 или 4).Немного проблематично то, что с этим я создаю тысячи бесполезных объектов, и сборщик мусора не успевает очистить после синтаксического анализатора, и неизбежное OutOfMemory приходит мне в голову ...иметь дело с этим;Лучше всего было бы, если бы я мог взять все содержимое <content></content>, но я не уверен, что это возможно с SAX-парсером.

Любая помощь приветствуется, и любое решение глубоко благодарно ...

Ответы [ 2 ]

3 голосов
/ 15 марта 2010

Если данные, которые вы пытаетесь прочитать, превышают доступную память, вам нужно сохранить данные, чтобы освободить память , чтобы продолжить чтение.

Рассматривали ли вы хранение ваших данных в sqlite базе данных во время чтения?

Вам также следует избегать создания множества бесполезных временных объектов. Можете ли вы избежать неприятностей с , мутировавшим с одним объектом или небольшим пулом объектов , чтобы избежать накопления мусора?

Если вы хотите получить в памяти все дерево документов, вам следует использовать синтаксический анализатор DOM (для этого в Android доступен DocumentBuilder). Однако, если у вас заканчивается памяти с использованием синтаксического анализатора SAX, вполне вероятно, что синтаксический анализатор DOM также будет исчерпан, если только ваши события SAX не создают и не уничтожают тонны экземпляров объектов.

2 голосов
/ 15 марта 2010

По большей части, вы не можете «создавать объекты достаточно быстро, чтобы ГХ не успевал». Фактически, когда требуется сборщик мусора, все ваше приложение приостанавливается до его завершения, поэтому вы просто не можете опередить его.

Единственным исключением из этого являются битовые карты, которые обрабатываются немного особым образом - они учитываются в куче Java, даже если их распределение не происходит на нем. Это нормально, за исключением того, что память растрового изображения не освобождается до запуска финализатора, а финализаторы do запускаются отдельно от собранного мусора и не блокируют приложение. Поэтому создание набора растровых изображений и простое их отпускание (без вызова метода для явного освобождения памяти растрового изображения) действительно может вызвать исключение нехватки памяти.

Но если вы не выделяете (и не отпускаете) объекты Bitmap, у вас есть другая проблема, возможно, просто ... не хватает памяти для всех ваших выделений. Вы можете использовать шляпный инструмент (и, в меньшей степени, простую информацию о куче Java в DDMS), чтобы увидеть, что вы выделили, используя столько места.

...