парсер экспатов: потребление памяти - PullRequest
0 голосов
/ 18 марта 2009

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

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

Ответы [ 4 ]

2 голосов
/ 18 марта 2009

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

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

1 голос
/ 20 мая 2011

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

1 голос
/ 18 марта 2009

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

1 голос
/ 18 марта 2009

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

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

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

...