찾다
백엔드 개발파이썬 튜토리얼원래 단어 재작성: 원래 버그로 간주되었던 것이 실제로는 Protobuf 설계의 기능이라는 예상치 못한 발견이 있었습니다.

안녕하세요 여러분, 저는 정말 대단해요.

최근 우리 프로젝트에서는 데이터 저장을 위한 캐리어로 protobuf 형식을 사용합니다. 실수로 큰 구멍을 묻었는데 그것을 발견하는 데 오랜 시간이 걸렸습니다.

protobuf 소개

protobuf의 전체 이름은 Protocal 버퍼입니다. 이는 Google에서 개발했으며 데이터 직렬화를 위한 교차 언어, 교차 플랫폼 및 확장 가능한 메커니즘입니다. XML과 비슷하지만 더 작고, 더 빠르고, 더 간단합니다. 데이터를 어떻게 구성할지 한 번만 정의하면 생성 도구를 사용하여 일부 직렬화 및 역직렬화 작업이 포함된 소스 코드를 생성할 수 있습니다. 구조화된 데이터는 다양한 데이터 스트림에서 다양한 프로그래밍 언어를 사용하여 쉽게 쓰고 읽을 수 있습니다.

proto2 버전은 Java, Python, Objective-C 및 C++에서 코드 생성을 지원합니다. 새로운 proto3 언어 버전에서는 Kotlin, Dart, Go, Ruby, PHP, C# 및 더 많은 언어를 사용할 수도 있습니다.

어떻게 알게 됐나요?

새 프로젝트에서는 protobuf 형식을 사용하여 실행되는 프로젝트의 데이터를 저장합니다. 이러한 방식으로 디버깅 과정에서 당사는 현장에 기록된 데이터를 기반으로 로컬 디버깅을 수행할 수 있습니다.

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;
}

저희는 이러한 데이터 세트를 정의한 다음 저장 시 센서의 세 가지 데이터 소스의 프레임 속도가 다르기 때문에 저장할 때 단일 센서에는 실제로 한 세트의 데이터만 포함되고 다른 두 유형의 데이터가 포함됩니다. 포함되지 않습니다.

싱글팩만 녹음했을 때는 문제가 없었어요. 단일 패킷을 오랫동안 기록할 수 없다고 느낄 때까지 패킷을 분할하는 솔루션을 찾아야 합니다.

당시에는 매우 간단할 것이라고 생각하여 패키지가 500M에 도달하면 후속 데이터를 새 패키지에 저장하도록 설정했습니다. 아주 원활하게 작성을 마치고 데이터 기록을 위해 현장에 올렸습니다. 잠시 녹음한 후 패키지를 다시 가져와 새 프로그램 테스트를 시뮬레이션했습니다. 일부 패키지의 데이터를 구문 분석하는 데 문제가 있는 것으로 나타났습니다. 프로그램이 실행 도중에 멈추게 됩니다. 많은 테스트 후에 일부 패키지에 이 문제가 있는 것으로 나타났습니다.

처음에 의심했던 것은 파일 크기를 판단하는 방법이 잘못되어 하도급에 영향을 미쳤다는 것입니다. 파일 크기를 판단하면 파일이 열리기 때문입니다. 그러나 파일을 열지 못하는 다른 여러 가지 방법을 판단한 후 분할이 수행되었습니다. 기록된 패키지 중 일부에 여전히 문제가 발생했습니다.

그때 나는 protobuf에 데이터 저장을 위한 몇 가지 특별한 요구 사항이 있다고 의심했습니다. 나중에 일부 기사를 읽고 protobuf가 여러 데이터 세트를 하나의 파일에 저장하려면 식별자가 필요하다는 것을 알게 되었습니다. 그렇지 않으면 파일에서 다시 구문 분석할 때 protobuf는 단일 데이터의 중지 문자가 어디에 있는지 알지 못해 데이터 구문 분석 오류가 발생합니다.

여기에 이런 구덩이가 나타납니다. 우리는 구분 작업을 수행하지 않고 일련의 데이터를 단일 패키지에 저장합니다. protobuf가 구문 분석할 때 파일의 모든 콘텐츠가 단일 센서로 구문 분석됩니다. 센서에는 모든 데이터가 포함되어 있으며 protobuf는 저장된 모든 데이터를 적극적으로 병합합니다.

이제 이전에 싱글 패킷을 녹음했을 때 데이터가 모두 정확했다는 것을 발견했습니다. 그것은 정말 행운이었습니다. protobuf가 성공적으로 구문 분석되었습니다.

어떻게 해결하나요?

이제 protobuf가 이런 방식으로 동작한다는 것을 알았으니, protobuf를 어떻게 나누는지만 알면 됩니다. 이 방법은 우리처럼 사용하는 사람이 너무 적기 때문에 찾기가 정말 어렵습니다. 중국어 검색에서는 이 콘텐츠를 전혀 찾을 수 없습니다. 아마도 모든 사람이 protobuf를 사용하여 데이터를 저장하지 않을 수도 있습니다.

결국 stackoverflow의 몇 가지 답변을 통해 답을 찾았습니다. 답변에서 이 솔루션은 protobuf 3.3에서만 공식적으로 병합되었다는 것을 알게 되었습니다. 이 기능은 정말 거의 사용하지 않는 것 같습니다.

bool SerializeDelimitedToOstream(const MessageLite& message,
 std::ostream* output);
bool ParseDelimitedFromZeroCopyStream(
MessageLite* message, io::ZeroCopyInputStream* input, bool* clean_eof);

이 두 가지 방법을 통해 데이터 스트림에 따라 파일을 하나씩 저장하고 읽을 수 있습니다. 더 이상 데이터 병합 및 읽기에 대해 걱정할 필요가 없습니다.

물론 이렇게 저장된 데이터는 원래의 파싱 방식으로는 파싱할 수 없으며, 저장 형식도 완전히 바뀌었습니다. 이 방법은 먼저 이진 데이터의 크기를 저장한 다음 이진 데이터를 저장합니다.

결론

고민 끝에 드디어 이 칸막이 피트를 해결했습니다. 사용 시나리오는 상대적으로 틈새적일 수 있으므로 전혀 찾을 수 없는 많은 정보가 발생할 수 있습니다. 소스 코드를 직접 살펴보면서 이러한 문제를 발견했습니다. C++의 소스 코드는 읽기가 정말 어렵습니다. 템플릿 메소드와 템플릿 클래스가 많아 일부 세부 사항을 놓치기 쉽습니다. 마지막으로 이를 완전히 확인하기 위해 C# 코드를 살펴보았습니다.

위 내용은 원래 단어 재작성: 원래 버그로 간주되었던 것이 실제로는 Protobuf 설계의 기능이라는 예상치 못한 발견이 있었습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 51CTO.COM에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
MobileSAM:为移动设备提供高性能的轻量级图像分割模型MobileSAM:为移动设备提供高性能的轻量级图像分割模型Jan 05, 2024 pm 02:50 PM

一、引言随着移动设备的普及和计算能力的提升,图像分割技术成为了研究的热点。MobileSAM(MobileSegmentAnythingModel)是一种针对移动设备优化的图像分割模型,旨在在保持高质量分割结果的同时,降低计算复杂度和内存占用,以便在资源有限的移动设备上高效运行。本文将详细介绍MobileSAM的原理、优势和应用场景。二、MobileSAM模型的设计思路MobileSAM模型的设计思路主要包括以下几个方面:轻量级模型:为了适应移动设备的资源限制,MobileSAM模型采用了轻量级

如何在Python中使用图像语义分割技术?如何在Python中使用图像语义分割技术?Jun 06, 2023 am 08:03 AM

随着人工智能技术的不断发展,图像语义分割技术已经成为图像分析领域的热门研究方向。在图像语义分割中,我们将一张图像中的不同区域进行分割,并对每个区域进行分类,从而达到对这张图像的全面理解。Python是一种著名的编程语言,其强大的数据分析和数据可视化能力使其成为了人工智能技术研究领域的首选。本文将介绍如何在Python中使用图像语义分割技术。一、前置知识在深入

Golang与FFmpeg: 如何实现音频合成和分割Golang与FFmpeg: 如何实现音频合成和分割Sep 27, 2023 pm 10:52 PM

Golang与FFmpeg:如何实现音频合成和分割,需要具体代码示例摘要:本文将介绍如何使用Golang和FFmpeg库来实现音频合成和分割。我们将用到一些具体的代码示例来帮助读者更好地理解。引言:随着音频处理技术的不断发展,音频合成和分割已经成为日常生活和工作中常见的功能需求。而Golang作为一种快速,高效且易于编写和维护的编程语言,加上FFmpeg作

Python 教程:如何使用 Python 分割和合并大文件?Python 教程:如何使用 Python 分割和合并大文件?Apr 22, 2023 am 11:43 AM

有时候,我们需要把一个大文件发送给别人,但是限于传输通道的限制,比如邮箱附件大小的限制,或者网络状况不太好,需要将大文件分割成小文件,分多次发送,接收端再对这些小文件进行合并。今天就来分享一下用Python分割合并大文件的方法。思路及实现如果是文本文件,可以按行数分割。无论是文本文件还是二进制文件,都可以按指定大小进行分割。使用Python的文件读写功能就可以实现文件的分割与合并,设置每个文件的大小,然后读取指定大小的字节就写入一个新文件,接收端依次读取小文件,把读取到的字节按序写入一个文件,就

减小win10录屏文件大小的建议减小win10录屏文件大小的建议Jan 04, 2024 pm 12:05 PM

许多的小伙伴都需要录屏进行办公或者传输文件,但是有时候会出现文件过大的问题制造了很多麻烦,下面就给大家带来了文件过大的解决方法,一起看看吧。win10录屏文件太大怎么办:1、下载软件格式工厂来进行压缩文件。下载地址>>2、进入主页面,点击“视频-MP4”选项。3、在转换格式页面中点击“添加文件”,选择要压缩的MP4文件。4、点击页面“输出配置”,通过输出质量来压缩文件。5、下拉配置列表选择“低质量和大小”点击“确定”。6、点击“确定”完成视频文件的导入。7、点击“开始”进行转化。8、完成后即可

原话重写:一个意外的发现是,原本被视为 bug 的问题实际上是 Protobuf 设计中的一种特性原话重写:一个意外的发现是,原本被视为 bug 的问题实际上是 Protobuf 设计中的一种特性May 09, 2023 pm 04:22 PM

大家好,我是了不起。最近我们在项目中,通过使用protobuf格式作为存储数据的一个载体。一个不小心就给自己埋了个大坑,还是过了好久才发现。protobuf简介protobuf全名叫Protocalbuffers.它是由Google研发的,一种可跨语言、可跨平台、可扩展的序列化数据的机制。类似于XML,但是它更小、更快、更简单。你只需要定义一次你希望的数据如何被结构化,然后你可以使用它的生成工具,生成包含一些序列化和反序列化等操作的源代码。可以轻松地从各种数据流和使用各种编程语言写入

在PHP中使用explode()函数将字符串分割成数组在PHP中使用explode()函数将字符串分割成数组Jun 27, 2023 am 10:18 AM

在PHP开发中,字符串常常需要被分割成若干个子字符串,以便我们在处理数据时更加方便。此时,PHP提供了explode()函数来帮助我们实现这个目的。explode()函数的基本语法为:explode(string$delimiter,string$string[,int$limit=PHP_MAXPATHLEN])其中,$delimiter

视频分割大结局!浙大最新发布SAM-Track:通用智能视频分割一键直达视频分割大结局!浙大最新发布SAM-Track:通用智能视频分割一键直达May 23, 2023 pm 02:07 PM

近期,浙江大学ReLER实验室将SAM与视频分割进行深度结合,发布Segment-and-TrackAnything(SAM-Track)。SAM-Track赋予了SAM对视频目标进行跟踪的能力,并支持多种方式(点、画笔、文字)进行交互。在此基础上,SAM-Track统一了多个传统视频分割任务,达成了一键分割追踪任意视频中的任意目标,将传统视频分割外推至通用视频分割。SAM-Track具有卓越的性能,在复杂场景下仅需单卡就能高质量地稳定跟踪数百个目标。项目地址:https://github.co

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

뜨거운 도구

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SublimeText3 영어 버전

SublimeText3 영어 버전

권장 사항: Win 버전, 코드 프롬프트 지원!

에디트플러스 중국어 크랙 버전

에디트플러스 중국어 크랙 버전

작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전