2 Stimmen

Thrift/Proto How to?

Ich muss ein großes Array von 100000 Objekten in eine Datei serialisieren, aber bei der De-Serialisierung möchte ich nur 1000 Objekte pro Lesevorgang lesen.

Derzeit finde ich keine guten Beispiele für Thrift oder Protocol Buffer für C#. Bitte kann mir jemand helfen.

Mit freundlichen Grüßen

2voto

Jon Skeet Punkte 1325502

Nun protobuf-csharp-port hat MessageStreamIterator y MessageStreamWriter die es Ihnen ermöglichen, eine Sequenz auszuschreiben und diese dann bei der Deserialisierung zu durchlaufen. Dann können Sie LINQ to Objects verwenden, um 1000 oder was immer Sie wollen zu erhalten.

1voto

Marc Gravell Punkte 970173

Wenn Sie protobuf-net verwenden, gibt es eine Methode DeserializeItems (oder ähnlich), die eine IEnumerable<T> Implementierung, die nicht gepuffert ist und es Ihnen ermöglicht, Elemente nach Belieben zu konsumieren (geeignet für LINQ "Take" usw.). Dies funktioniert perfekt, wenn das ursprünglich serialisierte Objekt eine Liste/ein Array von Objekten ist. Es ist auch vollständig kompatibel mit der DeserializeWithLengthPrefix-Methode, die ein einzelnes Objekt aus einem Stream liest, ohne zu viel zu lesen (solange es längenpräfixiert ist, was ist der Fall wenn ein Array/eine Liste von Elementen serialisiert wird), so dass Sie dasselbe z. B. in einer "while"-Schleife tun können. Lassen Sie mich wissen, wenn Sie vollständigere Beispiele wünschen.

Beispiel:

// 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);

Beachten Sie auch, dass Protokollpuffer anfügbar sind. Um einer Datei weitere Daten hinzuzufügen, suchen Sie einfach das Ende der Datei und beginnen mit dem Schreiben weiterer Daten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X