Хобрук: Ваш путь к мастерству в программировании

Как загружать, вычислять и записывать отдельные функции с потоком данных TPL?

Я просматривал поток данных tpl и пытался использовать его для решения моей текущей проблемы. Я просто не уверен, как это сделать (или я лаю не по тому дереву, а есть что-то более подходящее).

У меня есть огромный файл geojson с множеством функций, по которым я хотел бы провести некоторые расчеты. Первая часть довольно проста. У каждой функции есть свойство, называемое временем, и мне нужно сохранять данные в отдельные файлы по часам, то есть функция с 10:26 будет в файле с именем data10.geojson. Данные уже отсортированы по времени.

Я хотел бы избежать загрузки всего файла в память сразу, поэтому моя идея заключалась в том, чтобы загрузить в память одну функцию, узнать, какой у нее час, и сохранить ее в соответствующий файл часов. Моя идея состояла в том, чтобы использовать поток данных tpl, чтобы не ждать завершения одной функции, прежде чем начинать следующую (при условии, что я правильно понял это).

Образец геоджсона:

{
    "type": "FeatureCollection",
    "features": [
        {
            "Type": "Feature",
            "Geometry":
            {
                "Type": "Point",
                "Coordinates": [9, 55]
            },
            "Properties":
            {
                "time":"2019-08-08 10:39"
            }
        },
        Many more like this
    ]
}

Много погуглив, я нашел способ загружать функции json непосредственно из потока одну за другой (чтобы не загружать все в память):

ActionBlock<GeojsonFeature> writeOutFeature = new ActionBlock<GeojsonFeature>(feature => Console.WriteLine(JsonConvert.SerializeObject(feature)));

bool parsingArray = false;
using (FileStream fileStream = File.Open(inputPath, FileMode.Open))
using (StreamReader streamReader = new StreamReader(fileStream))
using (JsonReader jsonReader = new JsonTextReader(streamReader))
{
    var serializer = new JsonSerializer();
    while (jsonReader.Read())
    {

        // checking if the array has been reached yet
        if (!parsingArray && jsonReader.TokenType == JsonToken.StartArray)
        {
            parsingArray = true;
            continue; // next will be a feature
        }
        else if(jsonReader.TokenType == JsonToken.EndArray)
        {
            parsingArray = false;
            continue;
        }

        // loading feature
        if (parsingArray)
        {
            GeojsonFeature feature = serializer.Deserialize<GeojsonFeature>(jsonReader);
            await writeOutFeature.SendAsync(feature);
        }
    }

    writeOutFeature.Complete();
    await writeOutFeature.Completion;
}

Это просто записывает каждую функцию в ActionBlock, но мне нужно знать, как сохранить ее в файл, соответствующий часу, указанному в свойствах функции. (Они упорядочены, поэтому при изменении часа старый файл должен быть закрыт, а новый должен быть открыт и инициализирован).

Вкратце: Как загрузить функцию, классифицировать ее и сохранить в соответствующем выходном файле, не загружая все в память (быстро)?


  • Сколько вы готовы загрузить в память? Можете ли вы хотя бы сохранить GeojsonFeature объектов на один час? 08.08.2019
  • Похоже, вам может понадобиться что-то вроде очереди производитель-потребитель, где производитель просматривает файл и отправляет каждый GeojsonFeature потребителю, который сериализует входящий элемент в файл текущего часа, затем закрывает файл и открывает новый, когда час изменения. Аналогичный пример: C# — OutOfMemoryException, сохраняющий список в файле JSON. 08.08.2019

Новые материалы

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..

LeetCode Проблема 41. Первый пропущенный положительный результат
LeetCode Проблема 41. Первый пропущенный положительный результат Учитывая несортированный массив целых чисел, найдите наименьшее пропущенное положительное целое число. Пример 1: Input:..

Расистский и сексистский робот, обученный в Интернете
Его ИИ основан на предвзятых данных, которые создают предрассудки. Он словно переходит из одного эпизода в другой из серии Черное зеркало , а вместо этого представляет собой хронику..

Управление состоянием в микрофронтендах
Стратегии бесперебойного сотрудничества Микро-фронтенды — это быстро растущая тенденция в сфере фронтенда, гарантирующая, что удовольствие не ограничивается исключительно бэкэнд-системами..