Комиссионные / Прото Как? - PullRequest
2 голосов
/ 10 марта 2012

Мне нужно сериализовать большой массив объектов из 100000 в файл, но во время десериализации я хотел бы прочитать кусок 1000 объектов за чтение.

В настоящее время я не могу найти хороших примеровиз Thrift или протокола буфера для C #.Пожалуйста, кто-нибудь может мне помочь.

С уважением

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Ну, а protobuf-csharp-port имеет MessageStreamIterator и MessageStreamWriter, которые позволяют вам записать последовательность, а затем выполнить итерацию по ней при десериализации.Затем вы можете использовать LINQ to Objects, чтобы получить 1000 или что угодно.

1 голос
/ 10 марта 2012

Если вы используете 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);

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

...