2016-04-11 2 views
0

Мое приложение может импортировать файлы GPX (XML), а затем я использую замечательную библиотеку XML Dictionary, которая делает фантастическую работу по разбору XML и GPX, но в этом случае у меня есть файл размером 85 МБ, который я хочу попробовать и проанализировать. Он содержит более 16 000 путевых точек GPX, которые огромны.Как разобрать огромный XML-файл, который не исчерпал память

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

Как я могу разбить синтаксический анализ такого большого файла, чтобы я не получал ошибок памяти?

ответ

1

Проблема с используемой библиотекой XML-словаря заключается в том, что она создает массивное дерево объектов всего XML-файла. Это использует много памяти.

Вам гораздо лучше использовать синтаксический анализатор SAX, например, стандартный класс NSXMLParser. Ничего не хранится в памяти, кроме любых структур данных, которые вы сохраняете по мере разбора парсинга.

В любом случае вам не нужно загружать весь XML-файл в память перед разбором. Откройте поток в файл и передайте поток в парсер.

+0

'XML Dictionary' использует' NSXMLParser'. Что они делают по-другому? –

+0

Прочтите описание на главной странице проекта github. XML Dictionary создает огромное дерево объектов, представляющих весь XML-документ. Все эти дополнительные накладные расходы превышают то, что делает NSXMLParser, что вызывает проблемы с памятью. У вас по существу есть 3 копии файла XML в памяти. 1) Полная 'NSData' всего файла. 2) Гигантское дерево, построенное по XML Dictionary. 3) Ваша собственная модель данных после обработки проанализированного XML. # 1 можно избежать, открыв поток в файл XML, а не загружая весь файл в память. И вы можете избежать # 2, используя только NSXMLParser. – rmaddy

+0

Есть ли какие-нибудь вспомогательные классы, которые делают это? Я не располагаю информацией о том, как открыть поток, используя 'NSXMLParser', как вы упоминаете. –

Смежные вопросы