


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
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!

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

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



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.

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

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. 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

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

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

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

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
