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