Страница 16 из 18
cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 13:48
Дед Пахом
Файл 5MB загружается 15-20 сек.
Да ладно, проверил на файле размером 190mb, время загрузки 0.09 сек:
[1368] Load time: 0.09s, file size: 189778220b
Код: Выделить всё
PROGRAM
INCLUDE('cjson.inc'), ONCE
MAP
INCLUDE('printf.inc'), ONCE
END
sFileName STRING(256), AUTO
sFileContent &STRING, AUTO
tmStart LONG, AUTO
tmEnd LONG, AUTO
CODE
sFileName = 'citylots.json'
tmStart = CLOCK()
sFileContent &= json::LoadFile(sFileName)
tmEnd = CLOCK()
IF NOT sFileContent &= NULL
printd('Load time: %fs, file size: %ib', (tmEnd-tmStart)/100, SIZE(sFileContent))
DISPOSE(sFileContent)
ELSE
printd('Load time: %fs, file not found', (tmEnd-tmStart)/100)
END
cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 13:57
Дед Пахом
Разве что Вы с дискет 5,25 файлы читаете.
cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 17:54
Игорь Столяров
Дед Пахом писал(а): 02 Январь 2023, 13:57
Разве что Вы с дискет 5,25 файлы читаете.
Спасибо за Новогодний юмор, но конечно же нет.

Да это походный ноут который я беру с собой в неожиданные путешествия, но реально файл 5 MB грзится 15-20 сек.
А парсится за секунды.
cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 19:01
finsoftrz
Будь проклята эта бедность.

cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 19:22
Игорь Столяров
Возможно, мы сделали неправильный акцент на моём сообщении.
Я не имею претензий ни к классу cJSON, ни к WinAPI. Я понимаю, что на загрузку файла нужно время.
Сейчас это время адекватно. Я всего лишь указал, что при массовой обработке заголовков JSON пакетов
оно получается большим и я ищу решение.
Более того - я благодарен за подсказку в нужном направлении и далее смогу всё решить сам.

cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 21:16
Дед Пахом
Игорь Столяров писал(а): 02 Январь 2023, 19:22
Возможно, мы сделали неправильный акцент на моём сообщении.
Я не мог не отреагировать на сигнал. Сигнал не подтвердился!

cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 21:36
Игорь Столяров
Скорее была тема к обсуждению и каждый принял в ней участие так, как привык это делать.
А вот вопрос с индикацией процесса выполнения внутри методов - он остался.

cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 21:39
Дед Пахом
Игорь Столяров писал(а): 02 Январь 2023, 21:36
А вот вопрос с индикацией процесса выполнения внутри методов - он остался.
Записал себе в TODO.
cJSON: Формат полей для вложенных структур
Добавлено: 02 Январь 2023, 21:47
Игорь Столяров
Дед Пахом писал(а): 02 Январь 2023, 21:39
Записал себе в TODO
За это отдельное
Это скорей вопрос удобства. Хотя есть товарищи, которые успеают набрать мой номер и сообщить,
что программа зависла пока загружается 10 MByte файл JSON.

cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 0:56
Дед Пахом
Загрузил v1.35.
- depthLimit не влияет на скорость Parse(), хотя уменьшает объём используемой памяти.
- Пример использования ParseCallback: вывод текущего процента обработки в лог.
Код: Выделить всё
jsonFactory.ParseCallback PROCEDURE(LONG pInputLength, LONG pCurrentPos, LONG pCurrentDepth)
curPercent LONG(0), STATIC
newPercent LONG, AUTO
CODE
newPercent = (pCurrentPos/pInputLength*100)
IF newPercent > curPercent
curPercent = newPercent
printd('ParseCallback(%i, %i, %i): progress %i%%', pInputLength, pCurrentPos, pCurrentDepth, curPercent)
END
cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 6:15
Игорь Столяров
Дед Пахом писал(а): 02 Январь 2023, 13:48
Да ладно, проверил на файле размером 190mb, время загрузки 0.09 сек:
Полностью согласен.
Проблема не в загрузке текстового файла, а в том как тормозит parse_object().
Если технологически требуется выполнять полный перебор всех тегов в JSON структуре -
может быть сделать возможность для прерывания Loop в parse_object() на ненужном теге ?
Что-то вроде:
Код: Выделить всё
Packet Group
Heading Group ! Небольшой заголовок пакета
Fld01 String(40)
..
end
Items &Queue ! Супер-тушка пакета c несколькими тысячами записей и массивом документов на несколько MByte.
end
Code
MyJSon.BreakTag = 'items' ! Получить только заголовок пакета для идентификации
Root &= MyJSon.ParseFile(sFileName_,CP_ACP)
If Not (Root &= Null) ...

за рассмотрение вопроса !
cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 7:16
Игорь Столяров
Дед Пахом писал(а): 03 Январь 2023, 0:56
depthLimit не влияет на скорость Parse(), хотя уменьшает объём используемой памяти
И ещё требует правильную вложенную иерархическую струтуру JSON - что не всегда в наших силах сделать
(обработка внешних данных)
Дед Пахом писал(а): 03 Январь 2023, 0:56
- Пример использования ParseCallback:
Это реально работает ! Принято на вооружение.

cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 12:50
Дед Пахом
Игорь Столяров писал(а): 03 Январь 2023, 6:15
может быть сделать возможность для прерывания Loop в parse_object() на ненужном теге ?
Нет, так не получится.
cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 13:08
Игорь Столяров
Дед Пахом писал(а): 03 Январь 2023, 12:50
Нет, так не получится.
Спасибо за ответ. Понятно. Прерывание (BREAK) не допускается.
А что-то вроде CYCLE для прокручивания структуры без анализа содержимого тегов, начиная с указанного тега ?
Т.е. начиная с заданного тега просто считаем, что содержимое всех тегов NULL.
Я немного покопался на предмет, что именно вызывает торможение в ParseFile() / parse_object() -
ведь теперь это хорошо видно через ParseCallback().
Секунды (которые как изввестно спрессованы в года) уходят на большие по размеру теги с файлами.

cJSON: Формат полей для вложенных структур
Добавлено: 03 Январь 2023, 13:30
Дед Пахом
Прервать или "прокрутить" не получится, сломается последовательность обработки "символ за символом".
Загрузил v1.36, можно ожидать прироста скорости на длинных строках.