当前位置: 首页 > news >正文

Protobuf: 大数据开发中的高效数据传输利器

作为一名大数据开发者,我经常需要处理海量的数据传输和存储。在这个过程中,选择一个高效、可靠的数据序列化工具至关重要。今天,我想和大家分享一下我在项目中使用 Protobuf 的经历。

在这里插入图片描述

目录

    • 故事背景
    • Protobuf 简介
          • 优点:
    • 实战案例
      • 示例一:传感器数据
      • 示例二:用户信息
      • 示例三:复杂数据结构
      • 性能对比
    • 版本说明
    • 总结

故事背景

在我们团队的一个项目中,我们需要从多个传感器收集实时数据,并将这些数据传输到集中式服务器进行分析。起初,我们使用的是 JSON 格式,因为它易于阅读和调试。然而,随着数据量的增加,我们遇到了性能瓶颈:数据传输的速度越来越慢,服务器的处理负荷也越来越重。

在这种情况下,我们开始寻找一种更高效的数据传输方案。经过调研和比较,我们最终选择了 Google 的 Protocol Buffers(简称 Protobuf)。

Protobuf 简介

Protobuf 是一种灵活、高效的序列化工具,由 Google 开发。它可以将结构化的数据序列化为二进制格式,这种格式比 JSON 或 XML 更加紧凑和高效。

image.png

优点:
  1. 高效的二进制格式:Protobuf 使用二进制格式进行数据传输,比 JSON 更小、更快。
  2. 强类型定义:通过 .proto 文件定义数据结构,保证了数据的严格类型约束。
  3. 多语言支持:支持多种编程语言,如 C++、Java、Python、Go 等。

实战案例

以下是几个使用 Protobuf 进行数据传输的示例:

示例一:传感器数据

首先,我们需要定义一个 .proto 文件,描述数据结构。例如,我们的传感器数据包含传感器 ID、时间戳和温度值,可以这样定义:

syntax = "proto3";message SensorData {int32 sensor_id = 1;int64 timestamp = 2;float temperature = 3;
}

然后,使用 protoc 编译 .proto 文件,生成相应语言的代码。假设我们使用 Python,可以运行以下命令:

protoc --python_out=. sensor.proto

接下来,我们可以编写 Python 代码来序列化和反序列化数据:

import sensor_pb2# 创建一个 SensorData 对象
sensor_data = sensor_pb2.SensorData()
sensor_data.sensor_id = 1
sensor_data.timestamp = 1623072023
sensor_data.temperature = 23.5# 序列化为二进制数据
serialized_data = sensor_data.SerializeToString()# 反序列化为对象
sensor_data_parsed = sensor_pb2.SensorData()
sensor_data_parsed.ParseFromString(serialized_data)# 打印结果
print(f"Sensor ID: {sensor_data_parsed.sensor_id}")
print(f"Timestamp: {sensor_data_parsed.timestamp}")
print(f"Temperature: {sensor_data_parsed.temperature}")

image.png

示例二:用户信息

假设我们需要传输用户信息,包括用户 ID、用户名和邮箱地址,可以定义如下的 .proto 文件:

syntax = "proto3";message User {int32 user_id = 1;string username = 2;string email = 3;
}

同样地,使用 protoc 编译 .proto 文件,生成相应的 Python 代码:

protoc --python_out=. user.proto

然后,编写 Python 代码来处理用户信息:

import user_pb2# 创建一个 User 对象
user = user_pb2.User()
user.user_id = 123
user.username = "Alice"
user.email = "alice@example.com"# 序列化为二进制数据
serialized_user = user.SerializeToString()# 反序列化为对象
user_parsed = user_pb2.User()
user_parsed.ParseFromString(serialized_user)# 打印结果
print(f"User ID: {user_parsed.user_id}")
print(f"Username: {user_parsed.username}")
print(f"Email: {user_parsed.email}")

示例三:复杂数据结构

如果我们需要传输更复杂的数据结构,例如用户信息包含多个地址,可以定义如下的 .proto 文件:

syntax = "proto3";message Address {string street = 1;string city = 2;string state = 3;string zip = 4;
}message User {int32 user_id = 1;string username = 2;string email = 3;repeated Address addresses = 4;
}

编译 .proto 文件,生成相应的代码:

protoc --python_out=. user.proto

然后,编写 Python 代码来处理复杂数据结构:

import user_pb2# 创建一个 User 对象
user = user_pb2.User()
user.user_id = 123
user.username = "Alice"
user.email = "alice@example.com"# 添加地址
address1 = user.addresses.add()
address1.street = "123 Main St"
address1.city = "Springfield"
address1.state = "IL"
address1.zip = "62701"address2 = user.addresses.add()
address2.street = "456 Oak St"
address2.city = "Metropolis"
address2.state = "NY"
address2.zip = "10001"# 序列化为二进制数据
serialized_user = user.SerializeToString()# 反序列化为对象
user_parsed = user_pb2.User()
user_parsed.ParseFromString(serialized_user)# 打印结果
print(f"User ID: {user_parsed.user_id}")
print(f"Username: {user_parsed.username}")
print(f"Email: {user_parsed.email}")for address in user_parsed.addresses:print(f"Address: {address.street}, {address.city}, {address.state} {address.zip}")

性能对比

为了展示 Protobuf 的优势,我们做了一个简单的性能对比实验。在相同的数据量下,我们分别使用 JSON 和 Protobuf 进行序列化和反序列化,并比较两者的性能。

以下是 Python 代码示例,用于对比 JSON 和 Protobuf 的性能:

import time
import json
import sensor_pb2# 生成样本数据
data = {"sensor_id": 1,"timestamp": 1623072023,"temperature": 23.5
}# JSON 序列化和反序列化
start_time = time.time()
for _ in range(100000):json_data = json.dumps(data)data_parsed = json.loads(json_data)
end_time = time.time()
json_time = end_time - start_time# Protobuf 序列化和反序列化
sensor_data = sensor_pb2.SensorData()
sensor_data.sensor_id = 1
sensor_data.timestamp = 1623072023
sensor_data.temperature = 23.5start_time = time.time()
for _ in range(100000):serialized_data = sensor_data.SerializeToString()sensor_data_parsed = sensor_pb2.SensorData()sensor_data_parsed.ParseFromString(serialized_data)
end_time = time.time()
protobuf_time = end_time - start_timeprint(f"JSON time: {json_time} seconds")
print(f"Protobuf time: {protobuf_time} seconds")

结果显示,Protobuf 的序列化和反序列化速度远高于 JSON,尤其在数据量较大的情况下,这种优势更加明显。

版本说明

2.x 早就过时了
image.png

现在都用 4.25x 这样的,甚至是 5.27x,对应的编译器版本是 27x

image.png

总结

通过这些示例,我们可以看到 Protobuf 在大数据传输中的强大优势。它不仅提高了数据传输的效率,还保证了数据的类型安全。

如果你的项目中也需要处理大量的数据传输,不妨尝试一下 Protobuf,如果不大量还是 json 吧~

相关文章:

Protobuf: 大数据开发中的高效数据传输利器

作为一名大数据开发者,我经常需要处理海量的数据传输和存储。在这个过程中,选择一个高效、可靠的数据序列化工具至关重要。今天,我想和大家分享一下我在项目中使用 Protobuf 的经历。 目录 故事背景Protobuf 简介优点: 实战案例示…...

MySQL 面试相关问题

写在前面: 不喜勿喷,暴躁作者又不求你给钱【没办法,遇见的狗喷子太多了🐶】欢迎大家在评论区留言,指正文章中的信息错误有一些其他相关的问题,可以直接评论区留言,作者看到会及时更新到文章末尾…...

java org.aeonbits.owner库介绍

org.aeonbits.owner 是一个用于简化Java应用程序配置管理的库。它通过使用接口和注解来定义和读取配置,使得配置管理更加简洁和类型安全。以下是对这个库的一些主要特性和功能的介绍: 主要特性 类型安全的配置: OWNER 库允许开发者使用接口定义配置,从而提供了编译时的类型…...

YOLOv10改进 | 添加注意力机制篇 | 添加LSKAttention大核注意力机制助力极限涨点

一、本文介绍 在这篇文章中,我们将讲解如何将LSKAttention大核注意力机制应用于YOLOv10,以实现显著的性能提升。首先,我们介绍LSKAttention机制的基本原理,它主要通过将深度卷积层的2D卷积核分解为水平和垂直1D卷积核&#xff0…...

学习笔记——动态路由——IS-IS中间系统到中间系统(特性之路由撤销)

6、路由撤销 ISIS路由协议的路由信息是封装在LSP报文中的TLV中的,但是它对撤销路由的处理和OSPF的处理方式类似。 在ISIS中撤销一条路由实则是将接口下的ISIS关闭: 撤销内部路由: 在ISIS中路由信息是由IP接口TLV和IP内部可达性TLV共同来描…...

智能无人机控制:STM32微控制器与机器学习集成(内附资料)

智能无人机控制结合了STM32微控制器的实时处理能力和机器学习算法的决策能力,以实现更高级的自主飞行和任务执行。以下是智能无人机控制系统的概述,包括系统架构、关键组件、集成方法和示例代码。 系统概述 智能无人机控制系统利用STM32微控制器进行实…...

力扣 454四数相加

这个题给了四个数组,可以两两判断,就类比两数相加那道题了 对于num1 num2 用unordered_map存储,key是num1,num2中数字相加之和,value是值出现的次数 for(int a:num1) {for(int b:num2 {map[ab]; 最后要计算四个数…...

Java面试题系列 - 第9天

题目:深入探讨Java中的设计模式及其应用场景 背景说明:设计模式是软件工程中解决问题的常见方案,它们提供了经过验证的模板,帮助开发者解决在软件设计过程中遇到的特定问题。在Java中,熟悉并正确应用设计模式能够显著…...

数据结构【顺序表】

目录 ​ 线性表 顺序表 概念与结构 分类 静态顺序表 动态顺序表 动态顺序表的实现 在头文件中创建结构体 初始化顺序表 销毁顺序表(可以留到后面再看) 尾插数据 申请空间 打印顺序表数据 头插数据 尾删除数据 头删除数据 在指定位置插…...

【JavaScript 报错】未捕获的类型错误:Uncaught TypeError

🔥 个人主页:空白诗 文章目录 一、错误原因分析1. 调用不存在的方法2. 访问未定义的属性3. 数据类型不匹配4. 函数参数类型不匹配 二、解决方案1. 检查方法和属性是否存在2. 使用可选链操作符3. 数据类型验证4. 函数参数类型检查 三、实例讲解四、总结 在…...

html+css+js随机验证码

随机画入字符、线条 源代码在图片后面 点赞❤️关注&#x1f60d;收藏⭐️ 互粉必回 图示 源代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"…...

WPS打开PDF文件的目录

WPS打开PDF文件的目录 其实WPS中PDF文件并没有像Word那样标准的目录&#xff0c;但是倒是有书签&#xff0c;和目录一个效果 点击左上角书签选项&#xff0c;或者使用Alt Shift 1快捷键即可...

常见 Web漏洞分析与防范研究

前言&#xff1a; 在当今数字化时代&#xff0c;Web应用程序扮演着重要的角色&#xff0c;为我们提供了各种在线服务和功能。然而&#xff0c;这些应用程序往往面临着各种潜在的安全威胁&#xff0c;这些威胁可能会导致敏感信息泄露、系统瘫痪以及其他不良后果。 SQL注入漏洞 …...

暗黑魅力:Xcode全面拥抱应用暗黑模式开发指南

暗黑魅力&#xff1a;Xcode全面拥抱应用暗黑模式开发指南 随着苹果在iOS 13和iPadOS 13中引入暗黑模式&#xff0c;用户可以根据自己的喜好或环境光线选择不同的界面主题。作为开发者&#xff0c;支持暗黑模式不仅能提升用户体验&#xff0c;还能彰显应用的专业性。Xcode提供了…...

【游戏引擎之路】登神长阶(七)——x86汇编学习:凡做难事,必有所得

5月20日-6月4日&#xff1a;攻克2D物理引擎。 6月4日-6月13日&#xff1a;攻克《3D数学基础》。 6月13日-6月20日&#xff1a;攻克《3D图形教程》。 6月21日-6月22日&#xff1a;攻克《Raycasting游戏教程》。 6月23日-7月1日&#xff1a;攻克《Windows游戏编程大师技巧》。 7月…...

在 Windows 平台搭建 MQTT 服务

引言 MQTT 是一种轻量级、基于发布/订阅模式的消息传输协议&#xff0c;旨在用极小的代码空间和网络带宽为物联网设备提供简单、可靠的消息传递服务。MQTT 经过多年的发展&#xff0c;如今已被广泛应用于资源开采、工业制造、移动通信、智能汽车等各行各业&#xff0c;使得 MQ…...

jdevelope安装

准备 1.jdk1.8&#xff08;已经安装不做记录&#xff09; 2.下载jdevelope安装包 3.安装包安装jdevelope开发工具 4.创建或导入项目 下载jdevelope安装包 官网下载地址&#xff1a;https://edelivery.oracle.com 安装包安装jdevelope开发工具 cmd管理员权限运行安装脚本…...

排序(一)——冒泡排序、直接插入排序、希尔排序(BubbleSOrt,InsertSort,ShellSort)

欢迎来到繁星的CSDN&#xff0c;本期的内容主要包括冒泡排序(BubbleSort&#xff09;&#xff0c;直接插入排序(InsertSort)&#xff0c;以及插入排序进阶版希尔排序&#xff08;ShellSort&#xff09;。 废话不多说&#xff0c;直接上正题&#xff01; 一、冒泡排序 冒泡排序…...

synchronized关键字详解(全面分析)

目录 synchronized关键字详解1、synchronized关键字简介2、synchronized作用和使用场景作用使用场景①、用在代码块上(类级别同步)②、用在代码块上(对象级别同步)③、用在普通方法上(对象级别同步)④、用在静态方法上(类级别同步)总结&#xff1a; 3、synchronized底层原理&am…...

数据建设实践之大数据平台(三)

安装hadoop 上传安装文件到/opt/software目录并解压 [bigdatanode101 software]$ tar -zxvf hadoop-3.3.5.tar.gz -C /opt/services/ 配置环境变量 [bigdatanode101 ~]$ sudo vim /etc/profile.d/bigdata_env.sh export JAVA_HOME/opt/services/jdk1.8.0_161 export ZK_HO…...

Anthropic Zero Layer:大模型推理栈的原子化归一

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是一次架构级“蒸发” “Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题乍看像科技媒体的夸张头条&#xff0c;但作为连续跟踪Claude模型演进三年、亲手部署过从Haiku到Sonnet再到Opu…...

AlphaDev:用强化学习在汇编层发现最短正确排序程序

1. 项目概述&#xff1a;当AI开始重写计算机科学的“圣经” “AlphaDev&#xff1a;Sorting Algorithm ‘Hold My Beer’”——这个标题刚在2023年5月登上《Nature》封面时&#xff0c;我正在给一群刚学完冒泡排序的大二学生讲算法课。下课后有个学生举手问&#xff1a;“老师&…...

【VMware虚拟机】Linux下ubuntu连接网络详细讲解!

原理讲解 window上网需要网络适配器&#xff0c;通过家用路由器下发WLAN&#xff0c;自分配ip地址&#xff0c;连接即用 linux同理&#xff1a;在VMware虚拟机上需要”虚拟路由器“。对应为虚拟网络编辑器 1.打开虚拟网络编辑器 2.点击NAT&#xff0c;NAT模式和DHCP必须选上…...

STM32H7 QSPI Flash程序调试全攻略:从MDK配置到单步调试,解决‘算法加载失败’的常见问题

STM32H7 QSPI Flash程序调试实战&#xff1a;破解算法加载失败的终极指南 当你第一次看到MDK弹窗提示"Download Algorithm Failed"时&#xff0c;那种挫败感我深有体会。作为使用STM32H7系列开发过多个量产项目的工程师&#xff0c;我曾在QSPI Flash调试过程中踩过所…...

dumpsys netstats detail 输出解释netd的app的网络流量统计

dumpsys netstats detail 输出解释 重启后&#xff0c;数据会清零&#xff0c;从新统计 UID tag stats: Pending bytes: 27977 History since boot: ident[{type9, ratTypeCOMBINED, meteredtrue, defaultNetworktrue, oemManagedOEM_NONE, subId-1}] uid1000 setDEFAULT tag0x…...

ElevenLabs广西话输出突然失真?一文定位3类隐藏错误:声母浊化丢失、入声韵尾截断、连读变调失效

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;ElevenLabs广西话语音输出失真现象概览 ElevenLabs 作为当前主流的AI语音合成平台&#xff0c;其多语言支持能力广受开发者青睐。然而&#xff0c;在针对广西话&#xff08;粤语勾漏片与邕浔片混合变体…...

Puerts在UE5中实现TypeScript与蓝图无缝交互的实战指南

1. 这不是“加个插件就能用”的事&#xff1a;为什么Puerts在UE5里常被低估又频繁踩坑我第一次在UE5.1项目里集成Puerts时&#xff0c;以为照着GitHub README跑完C编译、TS声明生成、蓝图调用三步就能收工。结果花了整整三天——不是卡在编译失败&#xff0c;而是卡在“调用成功…...

大模型推理层归零:从vLLM到硬件直驱的架构革命

1. 项目概述&#xff1a;这不是一次普通更新&#xff0c;而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题乍看像科技媒体的夸张头条&#xff0c;但作为连续三年深度跟踪Claude模型演进、亲手部署过从claude-2.1到claud…...

Anthropic Managed Agents架构解析:Session日志化与沙箱凭证安全

1. 项目概述&#xff1a;一场被包装成“创新发布”的基础设施防御战你打开技术资讯推送&#xff0c;看到标题《Anthropic Just Shipped the Layer That’s Already Going to Zero》——不是夸张修辞&#xff0c;是字面意义上的精准判断。这不是某家初创公司押中风口的庆功宴&am…...

手把手教你配置海康NVR的GB28181国标编号,彻底告别‘通道数0’问题

海康NVR国标编号配置实战&#xff1a;从通道数为0到完美接入GB28181 第一次接触GB28181协议对接时&#xff0c;最让人抓狂的莫过于明明按照文档一步步配置&#xff0c;却在平台端看到冰冷的"通道数&#xff1a;0"。上周我就遇到了这个情况——客户新部署的海康NVR死活…...