Потребление памяти при разборе YAML с yaml-cpp

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

Я думал об использовании потоков:

JSON-источник (HTTP-клиент) ---> ZIP-декомпрессор ---> YAML-анализатор ----> объекты, сопоставленные с базой данных

Данные будут поступать из сети гораздо медленнее, чем я могу их проанализировать.

  1. Сколько памяти yaml-cpp нужно для анализа 1 МБ данных?
  2. Я хотел бы, чтобы уже проанализированные необработанные данные из декомпрессора и внутренней памяти, использованной для этих данных синтаксическим анализатором YAML, были выпущены, как только объект будет сопоставлен с базой данных. Является ли это возможным?
  3. Поддерживает ли yaml-cpp асинхронный анализ? Поэтому, как только объект JSON проанализирован, я могу сохранить его в базе данных, не дожидаясь полного содержимого из источника HTTP.

1 ответ

Поскольку у вас есть ограничения памяти, и ваши данные уже находятся в JSON, вы должны использовать анализатор с малым объемом памяти вместо синтаксического анализатора YAML. Попробуйте jsoncpp - хотя я не уверен, что они поддерживают потоковую передачу (поскольку в JSON нет концепции документов).

yaml-cpp предназначен для потоковой передачи, поэтому он не будет блокироваться, если есть документы для анализа, но поток все еще открыт; однако в yaml-cpp есть нерешенная проблема, когда он читает больше одного документа за раз, поэтому он действительно не предназначен для крайне низкого использования памяти.

Что касается объема памяти, необходимого для анализа 1 МБ данных, то, вероятно, она составляет порядка 3 МБ (необработанный входной поток, плюс проанализированный поток, плюс результирующая структура данных), но она может существенно различаться в зависимости от того, какого рода данных, которые вы анализируете.

Другие вопросы по тегам