Как обработать большой полуструктурированный файл json - PullRequest
0 голосов
/ 26 марта 2020

Мне нужно обработать большие JSON файлы, содержащие полуструктурированные данные. например,

{
   stream: [
   {
      datastream: [
         ...
      ],
      schema: {
         name: "",
         version: ""
      }
   }, 
   {
      datastream: [
         ...
      ],
      schema: {
         name: "",
         version: ""
      }
   }]
}

Я ожидаю, что файл json будет содержать объект со свойством "поток", который представляет собой набор объектов со свойствами "поток данных" и "схема". Свойство «datastream» может содержать тысячи объектов с произвольными свойствами. Что мне действительно нужно сделать, так это обработать каждый элемент в коллекциях «потока данных» и отправить их в другую систему. Другое ограничение заключается в том, что при отправке элементов «потока данных» мне необходимо отправить вместе с ними некоторые атрибуты соответствующей «схемы».

Текущий подход основан на чтении всего файла и десериализации содержимое в объект в памяти, а затем обрабатывается с обработкой. Это прекрасно работает, пока файлы не достигнут определенного размера. В настоящее время он начинает сбой с OutOfMemoryException, когда файлы превышают 300-400 МБ. Я также должен обрабатывать файлы размером более 1 ГБ. Каков наилучший подход для решения этой проблемы? Моя текущая попытка - использовать JsonTextReader из (Json. NET) и обрабатывать файл json по одному токену за раз. Это хорошо работает в отношении потребления памяти. Просто чтобы очистить этот подход, у меня нет полного содержимого файла в памяти. Самое большее, я ожидаю иметь текущий элемент / запись «поток данных» вместе со «схемой». Текущая проблема, с которой я сталкиваюсь при таком подходе, состоит в том, что он опирается на элемент «схема», появляющийся перед «потоком данных», если я хочу обогатить элементы «поток данных» перед их отправкой в ​​другую систему. Есть ли в этом смысл? Какой лучший способ go об этом?

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