Штатный парсер JSON - замедление обработки

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Штатный парсер JSON - замедление обработки

Сообщение harry »

Всем добрый день!
Наткнулся на такую проблему в C6 при обработке штатным парсером JSON (взят из С10 и небольшие изменения под себя) :
В цикле вызывается процедура парсинга JSON достаточно сложной структуры (документы Диадок),
в которой заполняется упрощенная кларионовская структура (очередь с парой вложенных групп) - для тестирования.
JSON структура содержит массив объектов из 20 записей. Первые несколько циклов парсинг выполняется
очень быстро (~ 0.05 c), даже на каком то цикле время обработки было чуть меньше предыдущих,
но примерно с 18-го цикла время обработки стало постоянно увеличиваться и счет идет на секунды, а затем и минуты.
Чем больше записей в массиве JSON, тем соответственно быстрее наступает момент увеличения времени парсинга.
Все объекты и очереди объявляются в вызываемой в цикле процедуре, так, что вроде, память должна освобождаться
после каждого цикла.
Пользуюсь давно этим парсером, но только сейчас наткнулся на тормоза, видимо не было таких больших объемов
обработки JSON.
В чем может быть проблема? Утечка памяти ? Кто то сталкивался с такой проблемой ?

Вот, примерный код тестовой программы для понимания сути эксперимента. Во вложении файл с JSON

Код: Выделить всё

 PROGRAM

  INCLUDE ('JSON.INC'),ONCE
  INCLUDE('CSTR.inc'),ONCE


  MAP
    ParseJSON_DD (String pJson)
  END

myCstr    Cstr

_DD_ReceiptStatus               Group,Type
ReceiptStatus                       string(40),name('ReceiptStatus') 
                                end

_DD_ConfirmationMetadata        Group(_DD_ReceiptStatus),Type
DateTimeTicks                       string(40),name('DateTimeTicks') 
                                end
_DD_AmendmentRequestMetadata    Group(_DD_ReceiptStatus),Type
AmendmentFlags                      string(10),name('AmendmentFlags')
                                end

_DD_Document                    Group,Type
IndexKey                            string(255),name('IndexKey') 
MessageId                           string(40),name('MessageId') 
EntityId                            string(40),name('EntityId') 
ConfirmationMetadata                Group(_DD_ConfirmationMetadata),name('ConfirmationMetadata'). 
AmendmentRequestMetadata            Group(_DD_AmendmentRequestMetadata),name('AmendmentRequestMetadata'). 
                                end

_DD_Document_Que                Queue(_DD_Document),Type.

_DD_DocumentList                Group,Type
TotalCount                          Long,name('TotalCount')
Documents                           &_DD_Document_Que,name('Documents')
HasMoreResults                      Byte,name('HasMoreResults')
                                end

  Code
	!Получаем строку JSON из файла
    myCstr.LoadFromFile('.\GetDocuments.txt')

    !Цикл парсинга 
    Loop
      ParseJSON_DD(myCstr.S)
    end
	
ParseJSON_DD   Procedure(String pJson)
JSON                JSONDataClass

Document_Que        Queue(_DD_Document_Que).


ResultGr            Group(_DD_DocumentList).

  Code

  JSON.AddSubQueue('Documents',Document_Que)
  json.SetExternalName('ConfirmationMetadata','ConfirmationMetadata')

  !Здесь засекаю время обработки
  StartTime# = Clock()
  
  !Парсинг
  JSON.FromJSON(pJson,ResultGr)

  !Время обработки
  EndTime# = Clock() - StartTime#  
Вложения
GetDocuments.txt
Файл с JSON
(82.34 КБ) 28 скачиваний
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Штатный парсер JSON - замедление обработки

Сообщение Игорь Столяров »

Проблемы в классе JSON связаны с постоянным расширением памяти и переливанием
данных из одной динамической переменной в другую (как и в ископаемом CSTR).

Там масса проблем и Вы не реализуете все структуры Контур.Диадок и их распарс.
Настоятельно рекомендую не тратить впустую время и воспользоваться бесплатным
классом cJSON с прекрасными примерами, в котором у Вас всё будет работать. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Штатный парсер JSON - замедление обработки

Сообщение harry »

Мой парсер, вроде, до сих пор все структуры корректно разбирал (кое что правил в исходном).
Про cJCON думал, но побоялся, что не все структуры смогу распарсить.
1. Насколько я помню, в cJSON нет возможности получить строку переменной длины, т.е. я заранее не знаю максимальный размер такой строки.
2. Возможно ли распарсить а cJSON вложенные очереди различной глубины ?
3. И главное, смогу cJSON в С6 использовать или там есть особенности, которые реализованы в С10 и выше ?
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7377
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Штатный парсер JSON - замедление обработки

Сообщение Игорь Столяров »

Я всего лишь рекомендую и не планирую с Вами спорить. ;)
А по cJSON Вам лучше ответит его автор (если конечно Вы создадите отдельную тему). :)
За теми кто отстал - не возвращаться. (С) Кодекс
harry
Бывалый
Сообщения: 69
Зарегистрирован: 24 Февраль 2015, 14:16
Поблагодарили: 3 раза

Штатный парсер JSON - замедление обработки

Сообщение harry »

Спасибо! Я не спорю, я интересуюсь )
Ответить