


Hallo zusammen, ich bin großartig.
In unserem Projekt verwenden wir kürzlich das Protobuf-Format als Träger zum Speichern von Daten. Ich habe mir versehentlich ein großes Loch gegraben, aber es hat lange gedauert, bis ich es entdeckt habe.
protobuf Einführung
Protobufs vollständiger Name ist Protocol buffers und ist ein sprach- und plattformübergreifendes, erweiterbares Protokoll Mechanismus zur Serialisierung von Daten. Ähnlich wie XML, aber kleiner, schneller und einfacher. Sie müssen nur einmal definieren, wie Ihre Daten strukturiert sein sollen, und können dann die Generierungstools verwenden, um Quellcode zu generieren, der einige Serialisierungs- und Deserialisierungsvorgänge enthält. Strukturierte Daten können problemlos aus einer Vielzahl von Datenströmen und mit einer Vielzahl von Programmiersprachen geschrieben und gelesen werden.
Die Proto2-Version unterstützt die Codegenerierung in Java, Python, Objective-C und C++. Mit der neuen Proto3-Sprachversion können Sie auch Kotlin, Dart, Go, Ruby, PHP und C# sowie viele weitere Sprachen verwenden.
Wie hast du es gefunden?
In unserem neuen Projekt speichern wir die Daten des Projektlaufs im Protobuf-Format. Auf diese Weise können wir während des Debugging-Prozesses ein lokales Debugging basierend auf den vor Ort aufgezeichneten Daten durchführen.
message ImageData { // ms int64 timestamp = 1; int32 id = 2; Data mat = 3; } message PointCloud { // ms int64 timestamp = 1; int32 id = 2; PointData pointcloud = 3; } message State { // ms int64 timestamp = 1; string direction = 2; } message Sensor { repeated PointCloud point_data = 1; repeated ImageData image_data = 2; repeated State vehicle_data = 3; }
Wir definieren einen solchen Datensatz und speichern dann, da die Bildraten der drei Datenquellen des Sensors unterschiedlich sind. Beim Speichern enthält ein einzelner Sensor tatsächlich nur einen Datensatz. , die beiden anderen Datenarten sind nicht enthalten.
Wir hatten kein Problem, als wir nur eine einzige Packung aufgenommen haben. Bis wir das Gefühl haben, dass ein einzelnes Paket längere Zeit nicht aufgezeichnet werden kann, müssen wir eine Lösung finden, um das Paket aufzuteilen.
Damals dachte ich, dass das sehr einfach sein muss. Wir richten ein Paket ein, um die nachfolgenden Daten in einem neuen Paket zu speichern, wenn es 500 Millionen erreicht. Ich habe es sehr reibungslos fertig geschrieben und es dann zur Datenaufzeichnung vor Ort abgelegt. Nachdem wir eine Weile aufgenommen hatten, nahmen wir das Paket zurück und simulierten das Testen unseres neuen Programms. Es wurde festgestellt, dass beim Parsen der Daten einiger Pakete ein Problem aufgetreten ist. Das Programm bleibt während der Ausführung hängen. Nach vielen Tests wurde festgestellt, dass dieses Problem bei einigen Paketen auftritt.
Was wir zunächst vermuteten, war, dass die Methode zur Beurteilung der Dateigröße falsch war, was sich auf die Vergabe von Unteraufträgen auswirkte. Denn bei der Beurteilung der Dateigröße wird die Datei geöffnet. Nachdem jedoch mehrere andere Möglichkeiten beurteilt worden waren, die Datei nicht zu öffnen, wurde die Aufteilung durchgeführt. Bei einigen der aufgezeichneten Pakete traten immer noch Probleme auf.
Erst dann kam mir der Verdacht, dass Protobuf einige besondere Anforderungen an die Datenspeicherung stellt. Später las ich einige Artikel und erfuhr, dass Protobuf Bezeichner benötigt, um mehrere Datensätze in einer Datei zu speichern. Andernfalls weiß protobuf beim Zurückparsen aus der Datei nicht, wo sich das Stoppzeichen einzelner Daten befindet, was zu Fehlern beim Parsen der Daten führt.
Hier erscheint diese Grube. Wir speichern eine Reihe von Daten in einem einzigen Paket ohne Trennoperationen. Beim Parsen von Protobuf werden alle Inhalte in der Datei in einem einzigen Sensor analysiert. Der Sensor enthält alle Daten und Protobuf führt alle gespeicherten Daten aktiv zusammen.
In diesem Moment stellte ich fest, dass bei der Aufzeichnung einzelner Pakete alle Daten korrekt waren. Das war wirklich mein Glück. protobuf wurde zufällig erfolgreich analysiert.
Wie kann man es lösen?
Da wir nun wissen, dass Protobuf auf diese Weise funktioniert, müssen wir nur noch wissen, wie man Protobuf teilt. Diese Methode ist wirklich schwer zu finden, weil es zu wenige Leute wie uns gibt, die sie anwenden. Die chinesische Suche kann diesen Inhalt überhaupt nicht finden. Möglicherweise verwendet nicht jeder Protobuf zum Speichern von Daten. Die Methode, die jeder verwendet, sollte das Szenario der Interaktion zwischen mehreren Diensten sein.
Endlich habe ich die Antwort durch einige Antworten zum Stackoverflow gefunden. Aus den Antworten habe ich erfahren, dass diese Lösung erst offiziell in Protobuf 3.3 integriert wurde. Es scheint, dass diese Funktion wirklich selten verwendet wird.
bool SerializeDelimitedToOstream(const MessageLite& message, std::ostream* output); bool ParseDelimitedFromZeroCopyStream( MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);
Durch dieses Methodenpaar können Dateien entsprechend dem Datenfluss einzeln gespeichert und gelesen werden. Machen Sie sich keine Sorgen mehr darüber, dass Daten zusammengeführt und gelesen werden.
Natürlich können die auf diese Weise gespeicherten Daten nicht mit der ursprünglichen Analysemethode analysiert werden, und das Speicherformat hat sich vollständig geändert. Diese Methode speichert zuerst die Größe der Binärdaten und dann die Binärdaten.
Fazit
Nach langem Hin und Her bin ich endlich durch diese Segmentierungsgrube gekommen. Das Nutzungsszenario kann relativ nischenorientiert sein, was dazu führt, dass viele Informationen überhaupt nicht gefunden werden können. Ich habe diese Probleme entdeckt, indem ich mir den Quellcode selbst angesehen habe. Der Quellcode von C++ ist wirklich schwer zu lesen. Es gibt viele Vorlagenmethoden und Vorlagenklassen, und es ist leicht, einige Details zu übersehen. Schließlich habe ich mir den C#-Code angesehen und ihn schließlich bestätigt.
Das obige ist der detaillierte Inhalt vonUrsprüngliche Worte umgeschrieben: Eine unerwartete Entdeckung ist, dass das, was ursprünglich als Fehler angesehen wurde, tatsächlich ein Merkmal im Design von Protobuf ist. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Die Flexibilität von Python spiegelt sich in Multi-Paradigm-Unterstützung und dynamischen Typsystemen wider, während eine einfache Syntax und eine reichhaltige Standardbibliothek stammt. 1. Flexibilität: Unterstützt objektorientierte, funktionale und prozedurale Programmierung und dynamische Typsysteme verbessern die Entwicklungseffizienz. 2. Benutzerfreundlichkeit: Die Grammatik liegt nahe an der natürlichen Sprache, die Standardbibliothek deckt eine breite Palette von Funktionen ab und vereinfacht den Entwicklungsprozess.

Python ist für seine Einfachheit und Kraft sehr beliebt, geeignet für alle Anforderungen von Anfängern bis hin zu fortgeschrittenen Entwicklern. Seine Vielseitigkeit spiegelt sich in: 1) leicht zu erlernen und benutzten, einfachen Syntax; 2) Reiche Bibliotheken und Frameworks wie Numpy, Pandas usw.; 3) plattformübergreifende Unterstützung, die auf einer Vielzahl von Betriebssystemen betrieben werden kann; 4) Geeignet für Skript- und Automatisierungsaufgaben zur Verbesserung der Arbeitseffizienz.

Ja, lernen Sie Python in zwei Stunden am Tag. 1. Entwickeln Sie einen angemessenen Studienplan, 2. Wählen Sie die richtigen Lernressourcen aus, 3. Konsolidieren Sie das durch die Praxis erlernte Wissen. Diese Schritte können Ihnen helfen, Python in kurzer Zeit zu meistern.

Python eignet sich für eine schnelle Entwicklung und Datenverarbeitung, während C für hohe Leistung und zugrunde liegende Kontrolle geeignet ist. 1) Python ist einfach zu bedienen, mit prägnanter Syntax, und eignet sich für Datenwissenschaft und Webentwicklung. 2) C hat eine hohe Leistung und eine genaue Kontrolle und wird häufig bei der Programmierung von Spielen und Systemen verwendet.

Die Zeit, die zum Erlernen von Python erforderlich ist, variiert von Person zu Person, hauptsächlich von früheren Programmiererfahrungen, Lernmotivation, Lernressourcen und -methoden und Lernrhythmus. Setzen Sie realistische Lernziele und lernen Sie durch praktische Projekte am besten.

Python zeichnet sich in Automatisierung, Skript und Aufgabenverwaltung aus. 1) Automatisierung: Die Sicherungssicherung wird durch Standardbibliotheken wie OS und Shutil realisiert. 2) Skriptschreiben: Verwenden Sie die PSUTIL -Bibliothek, um die Systemressourcen zu überwachen. 3) Aufgabenverwaltung: Verwenden Sie die Zeitplanbibliothek, um Aufgaben zu planen. Die Benutzerfreundlichkeit von Python und die Unterstützung der reichhaltigen Bibliothek machen es zum bevorzugten Werkzeug in diesen Bereichen.

Um die Effizienz des Lernens von Python in einer begrenzten Zeit zu maximieren, können Sie Pythons DateTime-, Zeit- und Zeitplanmodule verwenden. 1. Das DateTime -Modul wird verwendet, um die Lernzeit aufzuzeichnen und zu planen. 2. Das Zeitmodul hilft, die Studie zu setzen und Zeit zu ruhen. 3. Das Zeitplanmodul arrangiert automatisch wöchentliche Lernaufgaben.

Python zeichnet sich in Gaming und GUI -Entwicklung aus. 1) Spielentwicklung verwendet Pygame, die Zeichnungen, Audio- und andere Funktionen bereitstellt, die für die Erstellung von 2D -Spielen geeignet sind. 2) Die GUI -Entwicklung kann Tkinter oder Pyqt auswählen. Tkinter ist einfach und einfach zu bedienen. PYQT hat reichhaltige Funktionen und ist für die berufliche Entwicklung geeignet.


Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

SecLists
SecLists ist der ultimative Begleiter für Sicherheitstester. Dabei handelt es sich um eine Sammlung verschiedener Arten von Listen, die häufig bei Sicherheitsbewertungen verwendet werden, an einem Ort. SecLists trägt dazu bei, Sicherheitstests effizienter und produktiver zu gestalten, indem es bequem alle Listen bereitstellt, die ein Sicherheitstester benötigen könnte. Zu den Listentypen gehören Benutzernamen, Passwörter, URLs, Fuzzing-Payloads, Muster für vertrauliche Daten, Web-Shells und mehr. Der Tester kann dieses Repository einfach auf einen neuen Testcomputer übertragen und hat dann Zugriff auf alle Arten von Listen, die er benötigt.

PHPStorm Mac-Version
Das neueste (2018.2.1) professionelle, integrierte PHP-Entwicklungstool

DVWA
Damn Vulnerable Web App (DVWA) ist eine PHP/MySQL-Webanwendung, die sehr anfällig ist. Seine Hauptziele bestehen darin, Sicherheitsexperten dabei zu helfen, ihre Fähigkeiten und Tools in einem rechtlichen Umfeld zu testen, Webentwicklern dabei zu helfen, den Prozess der Sicherung von Webanwendungen besser zu verstehen, und Lehrern/Schülern dabei zu helfen, in einer Unterrichtsumgebung Webanwendungen zu lehren/lernen Sicherheit. Das Ziel von DVWA besteht darin, einige der häufigsten Web-Schwachstellen über eine einfache und unkomplizierte Benutzeroberfläche mit unterschiedlichen Schwierigkeitsgraden zu üben. Bitte beachten Sie, dass diese Software

Dreamweaver Mac
Visuelle Webentwicklungstools

Dreamweaver CS6
Visuelle Webentwicklungstools