Если вы используете protobuf-net, существует метод DeserializeItems (или аналогичный), который обеспечивает реализацию IEnumerable<T>
без буферизации, позволяя вам потреблять элементы по своему усмотрению (подходит для LINQ "Take" и т. Д.).Это прекрасно работает, если исходный сериализованный объект является списком / массивом объектов.Он также полностью совместим с методом DeserializeWithLengthPrefix, который считывает один объект из потока без перечитывания (как журнал, так и с префиксом длины, что имеет место , если массив / список элементовсериализовано), позволяя вам делать то же самое в, скажем, цикле while.Дайте мне знать, если вам нужны более полные примеры.
Пример:
// write
YourType[] array = ...;
Serializer.Serialize(destination, array);
// read
List<YourType> batch = new List<YourType>(1000);
foreach(var item in Serializer.DeserializeItems<YourType>(source)) {
batch.Add(item);
if(batch.Count == 1000) {
ProcessBatch(batch);
batch.Clear();
}
}
if(batch.Count != 0) ProcessBatch(batch);
Обратите внимание также на то, что буферы протокола можно добавлять, поэтому добавьте больше данных в файл, который вы просто ищете, до концафайл и начать писать больше данных.