Soll ich eine binäre oder eine Textdatei zum Speichern von Nachrichten protobuf?

StackOverflow https://stackoverflow.com/questions/1859267

  •  13-09-2019
  •  | 
  •  

Frage

Google protobuf verwenden, Ich spare mein serialisiert messaged Daten in eine Datei - in jeder Datei gibt es mehrere Meldungen. Wir haben beide C ++ und Python Versionen des Codes, also muss ich protobuf Funktionen nutzen, die in beiden Sprachen zur Verfügung stehen. Ich habe mit der Verwendung von SerializeToArray und SerializeAsString experimentiert und es scheint die folgenden unglücklichen Bedingungen zu sein:

  1. SerializeToArray: Wie in einer Antwort vorgeschlagen, der beste Weg, dies zu verwenden, ist jede Nachricht Präfix damit Datengröße ist. Dies würde große für C ++, aber in Python es sieht nicht so dies möglich ist - ist ich falsch

  2. ?
  3. SerializeAsString: Dies erzeugt eine serialisierte Zeichenfolge entspricht es binäres Gegenstück - was ich in eine Datei speichern kann, aber was ist, wenn in dem Serialisierung Ergebnis eines des Zeichens geschieht ist \ n - wie finden wir Zeilenende, oder das Ende der Nachrichten für diese Angelegenheit?

Update:

Bitte erlauben Sie mir, etwas neu zu formulieren. Wie ich es verstehe, kann ich nicht Binärdaten in C ++ schreiben, weil dann unsere Python-Anwendung, die Daten nicht lesen können, da sie nur String serialisiert Nachrichten analysieren kann. Sollte ich stattdessen verwenden Sie dann SerializeAsString in beide C ++ und Python? Wenn ja, dann ist es am beste Praxis, solche Daten in einer Textdatei zu speichern, anstatt eine Binärdatei? Mein Bauchgefühl ist binär, aber wie Sie aussehen sieht nicht wie eine Option.

War es hilfreich?

Lösung

Die beste Vorgehensweise für Nachrichten auf diese Weise verketten ist jede Nachricht mit seiner Größe vorangestellt wird. Auf diese Weise kann in der Größe lesen (versuchen, ein 32-Bit-int oder etwas), dann lesen Sie, dass die Anzahl von Bytes in einen Puffer und deserialisieren es. Dann lesen Sie die nächste Größe etc. etc.

Das gleiche gilt für Schreiben geht, müssen Sie zunächst die Größe der Nachricht schreiben, dann die Nachricht selbst.

Siehe Streaming mehr Meldungen auf der protobuf Dokumentation für mehr Informationen.

Andere Tipps

Wir haben großen Erfolg base64 haben die Nachrichten kodiert, und mit einem einfachen \ n Nachrichten zu trennen. Dies wird ofcoirse hängt viel über Ihre Benutzung - wir die Nachrichten in „log“ Dateien speichern müssen. Es hat natürlich auch Overhead-Codierung / Decodierung das. - aber das hat nicht einmal entfernt für uns ein Thema

Der Vorteil zu halten diese Nachrichten als Linie getrennt Text für die Wartung und Fehlersuche von unschätzbarem Wert bisher. Finde heraus, wie viele Nachrichten sind in einer Datei? wc -l. Finden Sie die N-te Nachricht - head ... | tail. Finde heraus, was mit Aufzeichnung auf einem Remote-System ist falsch Sie müssen durch 2-VPNs und eine Citrix-Lösung zugreifen? Kopieren Sie die Nachricht einfügen und es dem Programmierer Mail.

Protobuf ist ein binäres Format, so das Lesen und Schreiben soll als binären, Text nicht durchgeführt werden. Wenn Sie nicht Binärformat wollen, sollten Sie etwas anders als mit protobuf betrachten (es gibt viele Textdatenformate wie XML, JSON, CSV); nur Text Abstraktionen verwendet, ist nicht genug.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top