


Mots originaux réécrits : une découverte inattendue est que ce qui était initialement considéré comme un bug est en réalité une fonctionnalité de la conception de Protobuf.
Bonjour à tous, je suis incroyable.
Récemment, dans notre projet, nous utilisons le format protobuf comme support pour stocker les données. J'ai accidentellement enterré un grand trou pour moi-même, mais il m'a fallu beaucoup de temps pour le découvrir.
Introduction à protobuf
Le nom complet de protobuf est Protocal buffers. Il a été développé par Google et constitue un mécanisme multilingue, multiplateforme et évolutif pour la sérialisation des données. Similaire à XML, mais plus petit, plus rapide et plus simple. Il vous suffit de définir une seule fois la façon dont vous souhaitez que vos données soient structurées, puis vous pouvez utiliser ses outils de génération pour générer du code source qui inclut certaines opérations de sérialisation et de désérialisation. Les données structurées peuvent être facilement écrites et lues à partir de divers flux de données et à l'aide de divers langages de programmation.
La version proto2 prend en charge la génération de code en Java, Python, Objective-C et C++. Avec la nouvelle version du langage proto3, vous pouvez également utiliser Kotlin, Dart, Go, Ruby, PHP et C#, et bien d'autres langages.
Comment l'avez-vous découvert ?
Dans notre nouveau projet, nous stockons les données du projet exécuté en utilisant le format protobuf. De cette manière, pendant le processus de débogage, nous pouvons effectuer un débogage local sur la base des données enregistrées sur site.
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; }
Nous définissons un tel ensemble de données, puis lors du stockage, car les fréquences d'images des trois sources de données du capteur sont différentes, lors du stockage, un seul capteur ne contient en fait qu'un seul ensemble de données, et les deux autres types de données ne sont pas inclus.
Nous n’avons pas eu de problème lorsque nous n’avons enregistré qu’un seul pack. Jusqu'à ce que nous sentions qu'un seul paquet ne peut pas être enregistré pendant une longue période, nous devons trouver une solution pour diviser le paquet.
À cette époque, je pensais que cela devait être très simple, alors nous le configurons lorsqu'un package atteint 500 Mo, nous stockerons les données suivantes dans un nouveau package. J'ai fini de l'écrire très facilement, puis je l'ai mis sur place pour l'enregistrement des données. Après avoir enregistré pendant un moment, nous avons repris le package et simulé le test de notre nouveau programme. Il a été constaté qu'il y avait un problème lors de l'analyse des données de certains packages. Le programme restera bloqué au milieu de l'exécution. Après de nombreux tests, il a été constaté que certains packages présentaient ce problème.
Ce que nous soupçonnions au départ, c'est que la façon de juger de la taille des fichiers était erronée, ce qui affectait la sous-traitance. Parce qu'en jugeant la taille du fichier, le fichier sera ouvert. Mais après avoir jugé plusieurs autres moyens de ne pas ouvrir le dossier, la scission a été réalisée. J'ai encore rencontré des problèmes avec certains des packages enregistrés.
C'est alors que j'ai soupçonné que protobuf avait des exigences particulières en matière de stockage de données. Plus tard, j'ai lu quelques articles et appris que protobuf nécessite des identifiants pour stocker plusieurs ensembles de données dans un seul fichier. Sinon, lors de l'analyse du fichier, protobuf ne sait pas où se trouve le caractère d'arrêt d'une seule donnée, ce qui provoque des erreurs d'analyse des données.
Ici, cette fosse apparaît. Nous stockons une série de données dans un seul package sans effectuer aucune opération de séparation. Lorsque protobuf analyse, tout le contenu du fichier est analysé dans un seul capteur. Le capteur contient toutes les données et protobuf fusionne activement toutes les données stockées.
À ce moment-là, j'ai découvert que lorsque j'enregistrais des paquets individuels auparavant, les données étaient toutes correctes. C'était vraiment ma chance. protobuf est analysé avec succès.
Comment le résoudre ?
Maintenant que nous savons que protobuf fonctionnera de cette manière, il ne nous reste plus qu'à savoir comment diviser protobuf. Cette méthode est vraiment difficile à trouver car trop peu de gens comme nous l’utilisent. La recherche chinoise ne trouve pas du tout ce contenu. Peut-être que tout le monde n'utilise pas protobuf pour stocker des données. La méthode que tout le monde utilise devrait être le scénario d'interaction entre plusieurs services.
J'ai finalement trouvé la réponse grâce à quelques réponses sur stackoverflow. D'après les réponses, j'ai appris que cette solution n'a été officiellement fusionnée que dans protobuf 3.3. Il semble que cette fonction soit vraiment rarement utilisée.
bool SerializeDelimitedToOstream(const MessageLite& message, std::ostream* output); bool ParseDelimitedFromZeroCopyStream( MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);
Grâce à cette paire de méthodes, les fichiers peuvent être stockés et lus un par un en fonction du flux de données. Ne vous inquiétez plus de la fusion et de la lecture des données.
Bien entendu, les données stockées de cette manière ne peuvent pas être analysées par la méthode d'analyse d'origine et le format de stockage a complètement changé. Cette méthode stockera d'abord la taille des données binaires, puis stockera les données binaires.
Remarques finales
Après beaucoup de problèmes, j'ai finalement résolu cette fosse de séparation. Le scénario d'utilisation peut être relativement spécialisé, ce qui entraîne de nombreuses informations introuvables. J'ai découvert ces problèmes en regardant moi-même le code source. Le code source du C++ est vraiment difficile à lire. Il existe de nombreuses méthodes de modèles et classes de modèles et il est facile de manquer certains détails. Enfin, j'ai regardé le code C# et je l'ai finalement confirmé.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

AI Hentai Generator
Générez AI Hentai gratuitement.

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

1. Introduction Avec la popularisation des appareils mobiles et l'amélioration de la puissance de calcul, la technologie de segmentation d'images est devenue un point chaud de la recherche. MobileSAM (MobileSegmentAnythingModel) est un modèle de segmentation d'images optimisé pour les appareils mobiles. Il vise à réduire la complexité de calcul et l'utilisation de la mémoire tout en conservant des résultats de segmentation de haute qualité, afin de fonctionner efficacement sur des appareils mobiles dotés de ressources limitées. Cet article présentera en détail les principes, les avantages et les scénarios d'application de MobileSAM. 2. Idées de conception du modèle MobileSAM. Les idées de conception du modèle MobileSAM incluent principalement les aspects suivants : Modèle léger : Afin de s'adapter aux limitations de ressources des appareils mobiles, le modèle MobileSAM adopte un modèle léger.

Avec le développement continu de la technologie de l’intelligence artificielle, la technologie de segmentation sémantique des images est devenue une direction de recherche populaire dans le domaine de l’analyse d’images. Dans la segmentation sémantique d'image, nous segmentons différentes zones d'une image et classons chaque zone pour obtenir une compréhension globale de l'image. Python est un langage de programmation bien connu. Ses puissantes capacités d'analyse et de visualisation de données en font le premier choix dans le domaine de la recherche sur les technologies d'intelligence artificielle. Cet article expliquera comment utiliser la technologie de segmentation sémantique d'images en Python. 1. Les connaissances préalables s’approfondissent

Parfois, nous devons envoyer un gros fichier à d'autres, mais en raison des limitations du canal de transmission, telles que la limite de taille des pièces jointes aux e-mails, ou que l'état du réseau n'est pas très bon, nous devons diviser le gros fichier en petits fichiers. fichiers et envoyez-les plusieurs fois. Ensuite, fusionnez ces petits fichiers. Aujourd'hui, je vais partager comment diviser et fusionner des fichiers volumineux à l'aide de Python. Idée et mise en œuvre S'il s'agit d'un fichier texte, il peut être divisé par le nombre de lignes. Qu'il s'agisse d'un fichier texte ou d'un fichier binaire, il peut être divisé selon la taille spécifiée. À l'aide de la fonction de lecture et d'écriture de fichiers de Python, vous pouvez diviser et fusionner des fichiers, définir la taille de chaque fichier, puis lire les octets de la taille spécifiée et les écrire dans un nouveau fichier. L'extrémité réceptrice lit les petits fichiers dans l'ordre et les écrit. Les octets sont écrits dans un fichier dans l'ordre, donc

Golang et FFmpeg : Comment implémenter la synthèse et la segmentation audio, des exemples de code spécifiques sont requis Résumé : Cet article présentera comment utiliser les bibliothèques Golang et FFmpeg pour implémenter la synthèse et la segmentation audio. Nous utiliserons quelques exemples de code spécifiques pour aider les lecteurs à mieux comprendre. Introduction : Avec le développement continu de la technologie de traitement audio, la synthèse et la segmentation audio sont devenues des exigences fonctionnelles courantes dans la vie quotidienne et au travail. En tant que langage de programmation rapide, efficace et facile à écrire et à maintenir, Golang, associé à FFmpeg

De nombreux amis ont besoin d'enregistrer des écrans pour le travail de bureau ou de transférer des fichiers, mais parfois le problème des fichiers trop volumineux pose beaucoup de problèmes. Ce qui suit est une solution au problème des fichiers trop volumineux, jetons-y un coup d'œil. Que faire si le fichier d'enregistrement d'écran Win10 est trop volumineux : 1. Téléchargez le logiciel Format Factory pour compresser le fichier. Adresse de téléchargement >> 2. Entrez dans la page principale et cliquez sur l'option "Vidéo-MP4". 3. Cliquez sur « Ajouter un fichier » sur la page du format de conversion et sélectionnez le fichier MP4 à compresser. 4. Cliquez sur « Configuration de sortie » sur la page pour compresser le fichier en fonction de la qualité de sortie. 5. Sélectionnez « Faible qualité et taille » dans la liste de configuration déroulante et cliquez sur « OK ». 6. Cliquez sur "OK" pour terminer l'importation des fichiers vidéo. 7. Cliquez sur "Démarrer" pour démarrer la conversion. 8. Une fois terminé, vous pouvez

Salut à tous, je suis génial. Récemment, dans notre projet, nous avons utilisé le format protobuf comme support pour stocker les données. J'ai accidentellement enterré un grand trou pour moi-même, mais il m'a fallu beaucoup de temps pour le découvrir. Introduction à protobuf Le nom complet de protobuf est Protocalbuffers. Il a été développé par Google et constitue un mécanisme multilingue, multiplateforme et évolutif pour la sérialisation des données. Similaire à XML, mais plus petit, plus rapide et plus simple. Il vous suffit de définir une seule fois la façon dont vous souhaitez que vos données soient structurées, puis vous pouvez utiliser ses outils de génération pour générer du code source qui inclut certaines opérations de sérialisation et de désérialisation. Peut être facilement écrit à partir d'une variété de flux de données et en utilisant une variété de langages de programmation

Dans le développement PHP, les chaînes doivent souvent être divisées en plusieurs sous-chaînes pour faciliter le traitement des données. À l’heure actuelle, PHP fournit la fonction explosive() pour nous aider à atteindre cet objectif. La syntaxe de base de la fonction éclater() est la suivante : éclater(string$delimiter,string$string[,int$limit=PHP_MAXPATHLEN])where, $delimiter

Récemment, le laboratoire ReLER de l'Université du Zhejiang a profondément combiné SAM avec la segmentation vidéo et a publié Segment-and-TrackAnything (SAM-Track). SAM-Track donne à SAM la possibilité de suivre des cibles vidéo et prend en charge plusieurs modes d'interaction (points, pinceaux, texte). Sur cette base, SAM-Track unifie plusieurs tâches de segmentation vidéo traditionnelles, réalise le suivi de segmentation en un clic de n'importe quelle cible dans n'importe quelle vidéo et extrapole la segmentation vidéo traditionnelle à la segmentation vidéo universelle. SAM-Track offre d'excellentes performances et peut suivre de manière stable des centaines de cibles avec une haute qualité dans des scénarios complexes avec une seule carte. Adresse du projet : https://github.co
