Вопрос

Я использую expat parser для анализа XML -файла объемом около 15 ГБ.Проблема в том, что он выдает ошибку "Не хватает памяти", и программа завершается.

Я хочу знать, сталкивался ли кто-нибудь с подобной проблемой с парсером expat, или это известная ошибка, которая была исправлена в более поздних версиях?

Это было полезно?

Решение

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

Выделяете ли вы объекты при анализе XML и, возможно, не освобождаете их?Это было бы первое, что я бы проверил.Один из способов проверить, действительно ли проблема с expat или нет - если вы сократите программу до простой версии, которая имеет пустые обработчики тегов (т. е.он просто анализирует файл и ничего не делает с результатами) ему все еще не хватает памяти?

Другие советы

Я вообще не знаю expat, но я бы предположил, что по какой-то причине ему приходится хранить слишком много состояний в памяти.Сформирован ли каким-то образом XML-файл mal?Зарегистрированы ли у вас обработчики для конечных тегов больших блоков?

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

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

Expat - это анализатор, управляемый событиями, который не создает большие структуры в памяти.Так что проблема, вероятно, не в expat (который очень широко используется для синтаксического анализа больших файлов) - гораздо более вероятно, что это ваш собственный код.

У Expat есть утечки - я начал использовать его на давно работающем сервере и обнаружил, что из-за него постоянно происходит утечка памяти, независимо от того, освобожден анализатор или нет.Более поздние версии xmlparse.c не решают эту проблему, а только скрывают существующие утечки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top