Arhn - архитектура программирования

парсер expat: потребление памяти

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

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


  • какой язык программирования, какой парсер? 18.03.2009
  • C++ и парсер expat parser 18.03.2009

Ответы:


1

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

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

18.03.2009
  • Я совсем новичок в разборе. Есть ли у нас разные API для парсера SAX. Из используемого API я не могу подтвердить, использует ли он парсер SAX или DOM. 18.03.2009
  • С синтаксическим анализатором SAX вы будете писать такие методы, как begin_element, end_endelement, символы и т. д., и самостоятельно управлять состоянием во время синтаксического анализа. С парсером DOM он будет анализировать весь документ сразу, и вы сможете просматривать дерево документа в своем коде. 18.03.2009

  • 2

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

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

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

    18.03.2009
  • На самом деле у меня закончилась виртуальная память, ее объем превышает 2 ГБ. Увеличивается ли память, выделенная в куче, только для размера виртуальной памяти? 18.03.2009
  • sameer - может не хватить места в стеке, если у вас ОЧЕНЬ глубоко вложенные элементы, но это почти наверняка проблема с кучей. 18.03.2009
  • Все в вашем процессе (куча, стек, программа и т. д.) является частью виртуальной памяти вашего процесса. Возможно, вы захотите попробовать проанализировать файл без зарегистрированных обработчиков (или только с одним в начале чего-то) и посмотреть, выйдет ли из строя expat или нет. 19.03.2009

  • 3

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

    18.03.2009

    4

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

    20.05.2011
    Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..