Потребление памяти при разборе YAML с yaml-cpp
Я занимаюсь разработкой приложения Qt для встроенной системы с ограниченной памятью. Мне нужно получить несколько мегабайт данных JSON и проанализировать их как можно быстрее, не используя слишком много памяти.
Я думал об использовании потоков:
JSON-источник (HTTP-клиент) ---> ZIP-декомпрессор ---> YAML-анализатор ----> объекты, сопоставленные с базой данных
Данные будут поступать из сети гораздо медленнее, чем я могу их проанализировать.
- Сколько памяти yaml-cpp нужно для анализа 1 МБ данных?
- Я хотел бы, чтобы уже проанализированные необработанные данные из декомпрессора и внутренней памяти, использованной для этих данных синтаксическим анализатором YAML, были выпущены, как только объект будет сопоставлен с базой данных. Является ли это возможным?
- Поддерживает ли yaml-cpp асинхронный анализ? Поэтому, как только объект JSON проанализирован, я могу сохранить его в базе данных, не дожидаясь полного содержимого из источника HTTP.
1 ответ
Поскольку у вас есть ограничения памяти, и ваши данные уже находятся в JSON, вы должны использовать анализатор с малым объемом памяти вместо синтаксического анализатора YAML. Попробуйте jsoncpp - хотя я не уверен, что они поддерживают потоковую передачу (поскольку в JSON нет концепции документов).
yaml-cpp предназначен для потоковой передачи, поэтому он не будет блокироваться, если есть документы для анализа, но поток все еще открыт; однако в yaml-cpp есть нерешенная проблема, когда он читает больше одного документа за раз, поэтому он действительно не предназначен для крайне низкого использования памяти.
Что касается объема памяти, необходимого для анализа 1 МБ данных, то, вероятно, она составляет порядка 3 МБ (необработанный входной поток, плюс проанализированный поток, плюс результирующая структура данных), но она может существенно различаться в зависимости от того, какого рода данных, которые вы анализируете.