Подтвердить что ты не робот

12 Мб текстовых данных скачать с url и сохранить на SD-карту... Ошибка памяти кучи. любое решение?

Я использую оба следующих, но не работающих для огромных данных. 12 МБ

char[] chars = new char[1024];
int len;
while((len=buffer.read(chars))>0) {
    data.append(chars,0,len);
}

и

while ((line = reader.readLine()) != null) {
    sb.append(line + "\n");
}
4b9b3361

Ответ 1

У меня была одна и та же проблема, и я использую эту, вы должны разделить xml файл, если это возможно, а затем попытаться прочитать этот файл в строке и проанализировать его.

Ответ 2

Сохраните данные в кусках на SD-карту. Затем, используя встроенный Android XmlPullParser, вы можете проанализировать ранее сохраненный файл следующим образом:

  • Откройте входной поток только что загруженного файла.
  • Используйте метод setInput(InputStream inputStream, String inputEncoding)
  • Получайте удовольствие при анализе этого огромного XML файла.

Ответ 3

прочитайте в частях данные 1mb и используйте SAXParser для разбора

Ответ 4

Почему бы не прочитать ваш XML в кусках и сохранить каждый кусок на SD-карту? Единственная проблема в этом решении заключается в том, что вам нужен какой-то XML-парсер, который может динамически загружать части вашего XML и анализировать их.

Может быть, вы можете использовать Streaming API для XML, называемый StaX, и писать пользовательский поток ввода для этого случая. Пример http://www.vogella.com/articles/JavaXML/article.html#javastax

Ответ 5

  • Создать экземпляр XmlPullParser
  • Вызовите XmlPullParser.setInput с вашим вводом (либо Reader, либо InputStream); то есть данные, которые вы загружаете (по Socket или по-другому).
  • Используйте функции XmlPullParser для анализа текстового файла xml.

Примечание: вам нужно сделать это в основном разделе, это может занять много времени, чтобы загрузить файл. (В любом случае, вы не можете выполнять сетевую задачу в потоке пользовательского интерфейса). Это должно быть эффективно с точки зрения памяти, XmlPullParser не кэширует данные в памяти. Не нужно сначала хранить файл на SD-карте.

Также следите за ошибками: время ожидания подключения, ошибки в xml и т.д. Относитесь к своей работе как к успеху, когда парсер сообщает, что он достиг конца документа.

Ответ 6

Вероятно, вы должны попробовать выделить всего 12 Мб в память, а затем проверить, выполнено ли распределение. Затем загрузите данные в буфер.

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

Ответ 7

Вам нужно разобрать весь XML-поток и создать один огромный объект DOM или выполнить синтаксический анализ блоков?

Если вы ДОЛЖНЫ разобрать полный XML, чем единственное, что вы можете сделать, это получить больше памяти и 64-битную ОС.
Если нет, используйте синтаксический анализатор SAX или StAX для получения и анализа фрагментов непосредственно из потока или после его локального сохранения.

Ответ 8

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

-In этот вы можете найти ссылку на статью о как использовать SAX

-In this, вы можете найти еще один SAX и DOM

Я надеюсь, что эти две статьи помогут вам достичь того, что вам нужно. Или если обе статьи потерпят неудачу с вашей проблемой, то вы можете попытаться найти лучший способ организовать свой XML, всегда есть лучший способ сделать это, вам просто нужно подумать немного сложнее.

UPDATE:

-Это другое сообщение о STAX может быть полезно, потому что это STreaming Api для обработки XML, поэтому он может быть лучшим для ваш случай.