Я просматривал поток данных 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, но мне нужно знать, как сохранить ее в файл, соответствующий часу, указанному в свойствах функции. (Они упорядочены, поэтому при изменении часа старый файл должен быть закрыт, а новый должен быть открыт и инициализирован).
Вкратце: Как загрузить функцию, классифицировать ее и сохранить в соответствующем выходном файле, не загружая все в память (быстро)?