Inhaltsverzeichnis
protobuf Einführung " >protobuf Einführung
Wie hast du es gefunden? " >Wie hast du es gefunden?
Wie kann man es lösen? " >Wie kann man es lösen?
Fazit" >Fazit
Heim Backend-Entwicklung Python-Tutorial Ursprü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

Ursprü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

May 09, 2023 pm 04:22 PM
分割 protobuf feature

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;
}
Nach dem Login kopieren

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);
Nach dem Login kopieren

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!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Wie man alles in Myrise freischaltet
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

MobileSAM: Ein leistungsstarkes, leichtes Bildsegmentierungsmodell für mobile Geräte MobileSAM: Ein leistungsstarkes, leichtes Bildsegmentierungsmodell für mobile Geräte Jan 05, 2024 pm 02:50 PM

1. Einleitung Mit der Popularisierung mobiler Geräte und der Verbesserung der Rechenleistung ist die Bildsegmentierungstechnologie zu einem Forschungsschwerpunkt geworden. MobileSAM (MobileSegmentAnythingModel) ist ein für mobile Geräte optimiertes Bildsegmentierungsmodell. Es zielt darauf ab, die Rechenkomplexität und den Speicherverbrauch zu reduzieren und gleichzeitig qualitativ hochwertige Segmentierungsergebnisse beizubehalten, um eine effiziente Ausführung auf mobilen Geräten mit begrenzten Ressourcen zu ermöglichen. In diesem Artikel werden die Prinzipien, Vorteile und Anwendungsszenarien von MobileSAM im Detail vorgestellt. 2. Designideen des MobileSAM-Modells umfassen hauptsächlich die folgenden Aspekte: Leichtgewichtiges Modell: Um sich an die Ressourcenbeschränkungen mobiler Geräte anzupassen, übernimmt das MobileSAM-Modell ein leichtes Modell.

Wie verwende ich die Bildsemantiksegmentierungstechnologie in Python? Wie verwende ich die Bildsemantiksegmentierungstechnologie in Python? Jun 06, 2023 am 08:03 AM

Mit der kontinuierlichen Weiterentwicklung der Technologie der künstlichen Intelligenz hat sich die Bildsemantiksegmentierungstechnologie zu einer beliebten Forschungsrichtung im Bereich der Bildanalyse entwickelt. Bei der semantischen Bildsegmentierung segmentieren wir verschiedene Bereiche in einem Bild und klassifizieren jeden Bereich, um ein umfassendes Verständnis des Bildes zu erreichen. Python ist eine bekannte Programmiersprache. Aufgrund seiner leistungsstarken Datenanalyse- und Datenvisualisierungsfähigkeiten ist es die erste Wahl auf dem Gebiet der Technologieforschung im Bereich der künstlichen Intelligenz. In diesem Artikel wird die Verwendung der Bildsemantiksegmentierungstechnologie in Python vorgestellt. 1. Vorkenntnisse werden vertieft

Python-Tutorial: Wie teile ich große Dateien mit Python auf und füge sie zusammen? Python-Tutorial: Wie teile ich große Dateien mit Python auf und füge sie zusammen? Apr 22, 2023 am 11:43 AM

Manchmal müssen wir eine große Datei an andere senden, aber aufgrund von Einschränkungen des Übertragungskanals, z. B. der Begrenzung der Größe von E-Mail-Anhängen oder der nicht sehr guten Netzwerkbedingungen, müssen wir die große Datei in kleine aufteilen Dateien und senden Sie sie mehrmals. Führen Sie diese kleinen Dateien dann zusammen. Heute werde ich zeigen, wie man große Dateien mit Python aufteilt und zusammenführt. Idee und Umsetzung Handelt es sich um eine Textdatei, kann diese durch die Anzahl der Zeilen geteilt werden. Unabhängig davon, ob es sich um eine Textdatei oder eine Binärdatei handelt, kann sie entsprechend der angegebenen Größe aufgeteilt werden. Mit der Dateilese- und -schreibfunktion von Python können Sie Dateien aufteilen und zusammenführen, die Größe jeder Datei festlegen und dann Bytes der angegebenen Größe lesen und in eine neue Datei schreiben. Das empfangende Ende liest die kleinen Dateien nacheinander und schreibt sie Die Bytes werden also der Reihe nach in eine Datei geschrieben

Golang und FFmpeg: So implementieren Sie Audiosynthese und -segmentierung Golang und FFmpeg: So implementieren Sie Audiosynthese und -segmentierung Sep 27, 2023 pm 10:52 PM

Golang und FFmpeg: So implementieren Sie Audiosynthese und -segmentierung. Es sind spezifische Codebeispiele erforderlich. Zusammenfassung: In diesem Artikel wird erläutert, wie Sie Golang- und FFmpeg-Bibliotheken zum Implementieren von Audiosynthese und -segmentierung verwenden. Wir werden einige spezifische Codebeispiele verwenden, um den Lesern das Verständnis zu erleichtern. Einleitung: Mit der kontinuierlichen Weiterentwicklung der Audioverarbeitungstechnologie sind Audiosynthese und -segmentierung zu allgemeinen Funktionsanforderungen im täglichen Leben und bei der Arbeit geworden. Als schnelle, effiziente und einfach zu schreibende und zu wartende Programmiersprache gilt Golang in Verbindung mit FFmpeg

Tipps zum Reduzieren der Größe der Win10-Bildschirmaufzeichnungsdatei Tipps zum Reduzieren der Größe der Win10-Bildschirmaufzeichnungsdatei Jan 04, 2024 pm 12:05 PM

Viele Freunde müssen Bildschirme für Büroarbeiten aufzeichnen oder Dateien übertragen, aber manchmal verursacht das Problem zu großer Dateien große Probleme. Im Folgenden finden Sie eine Lösung für das Problem zu großer Dateien. Schauen wir uns das an. Was tun, wenn die Win10-Bildschirmaufzeichnungsdatei zu groß ist: 1. Laden Sie die Software Format Factory herunter, um die Datei zu komprimieren. Download-Adresse >> 2. Rufen Sie die Hauptseite auf und klicken Sie auf die Option „Video-MP4“. 3. Klicken Sie auf der Seite mit dem Konvertierungsformat auf „Datei hinzufügen“ und wählen Sie die zu komprimierende MP4-Datei aus. 4. Klicken Sie auf der Seite auf „Ausgabekonfiguration“, um die Datei entsprechend der Ausgabequalität zu komprimieren. 5. Wählen Sie „Geringe Qualität und Größe“ aus der Dropdown-Konfigurationsliste und klicken Sie auf „OK“. 6. Klicken Sie auf „OK“, um den Import der Videodateien abzuschließen. 7. Klicken Sie auf „Start“, um die Konvertierung zu starten. 8. Nach Abschluss können Sie

Ursprü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 Ursprü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 May 09, 2023 pm 04:22 PM

Hallo zusammen, ich bin großartig. Kürzlich haben wir in unserem Projekt das Protobuf-Format als Träger zum Speichern von Daten verwendet. Ich habe mir versehentlich ein großes Loch gegraben, aber es hat lange gedauert, bis ich es entdeckt habe. Einführung in Protobuf Der vollständige Name von Protobuf ist Protocalbuffers. Es wurde von Google entwickelt und ist ein sprach-, plattform- und skalierbarer 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. Kann problemlos aus einer Vielzahl von Datenströmen und mit einer Vielzahl von Programmiersprachen geschrieben werden

Teilen Sie die Zeichenfolge mithilfe der Funktion „explodieren()' in PHP in ein Array auf Teilen Sie die Zeichenfolge mithilfe der Funktion „explodieren()' in PHP in ein Array auf Jun 27, 2023 am 10:18 AM

In der PHP-Entwicklung müssen Zeichenfolgen häufig in mehrere Teilzeichenfolgen aufgeteilt werden, um die Datenverarbeitung für uns komfortabler zu gestalten. Derzeit stellt PHP die Funktion explosion() bereit, um uns beim Erreichen dieses Ziels zu helfen. Die grundlegende Syntax der Funktion „explosiv()“ lautet: explosion(string$delimiter,string$string[,int$limit=PHP_MAXPATHLEN])wo, $delimiter

Finale der Videosegmentierung! Die Universität Zhejiang hat kürzlich SAM-Track veröffentlicht: universelle intelligente Videosegmentierung mit einem Klick Finale der Videosegmentierung! Die Universität Zhejiang hat kürzlich SAM-Track veröffentlicht: universelle intelligente Videosegmentierung mit einem Klick May 23, 2023 pm 02:07 PM

Kürzlich hat das ReLER-Labor der Universität Zhejiang SAM intensiv mit Videosegmentierung kombiniert und Segment-and-TrackAnything (SAM-Track) veröffentlicht. SAM-Track gibt SAM die Möglichkeit, Videoziele zu verfolgen und unterstützt mehrere Arten der Interaktion (Punkte, Pinsel, Text). Auf dieser Basis vereint SAM-Track mehrere herkömmliche Videosegmentierungsaufgaben, ermöglicht die Segmentierungsverfolgung jedes Ziels in jedem Video mit einem Klick und extrapoliert die herkömmliche Videosegmentierung auf eine universelle Videosegmentierung. SAM-Track verfügt über eine hervorragende Leistung und kann in komplexen Szenarien mit nur einer Karte Hunderte von Zielen stabil und mit hoher Qualität verfolgen. Projektadresse: https://github.co

See all articles