Наткнулся на такую проблему в 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#