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

start_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_time

print(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 吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/793626.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在【Open3D】点云世界中精准定位,绘制立方体标记特定点位

Open3D精准定位点云特定点,绘制醒目立方体标记,提升数据解读效率与直观性。 Open3D是一个开源的跨平台计算机视觉库,它为开发人员提供了一个易于使用且高性能的3D数据处理平台。 # pcd:传入原始点云图 # point1:要进…

【HarmonyOS】获取通讯录信息

【HarmonyOS】获取通讯录信息 一、问题背景: 在Android和IOS中,获取手机通讯录信息的方式,一般是申请通讯录权限后,获得手机所有的通讯录列表信息。 在鸿蒙中,因为权限方式安全性提高的变更:将用户权限限…

springboot 旅游导航系统-计算机毕业设计源码69476

目 录 第 1 章 引 言 1.1 选题背景 1.2 研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系统性需求分析…

【Python实战因果推断】30_双重差分1

目录 Panel Data 在讨论了干预效果异质性之后,是时候转换一下思路,回到平均干预效果上来了。在接下来的几章中,您将学习如何利用面板数据进行因果推断。 面板数据是一种跨时间重复观测的数据结构。在多个时间段观察同一单位,可以…

347. 前 K 个高频元素(中等)

347. 前 K 个高频元素 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:347. 前 K 个高频元素 2.详细题解 寻找出现频率前 k k k高的元素,因此需要先统计各个元素出现的次数,该步骤时间复杂度为 O ( n ) O(n) O(n)…

前端-Cookie篇

文章目录 一、由来什么是Cookie?特点Cookie的类型 二、原理三、Cookie生成机制客户端设置案例 四、属性五、缺陷最后分享一段自己工作中封装的一些关于cookie的公众方法✒️总结 前端Cookie是Web开发中非常重要的一部分,它是服务器发送到用户浏览器并保存…

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字

如何识别图片文字转化为文本?5个软件帮助你快速提取图片文字 将图片中的文字提取为文本是一项非常有用的技能,特别是当你需要处理大量扫描文档、截图或其他图片时。以下是五款能够帮助你快速提取图片文字的软件: 迅捷文字识别 这是一款非…

对接高德开放平台API

高德开放平台API: https://lbs.amap.com/ 一、天气查询 天气查询: https://lbs.amap.com/api/webservice/guide/api/weatherinfo adcode城市码表下载: https://lbs.amap.com/api/webservice/download Component public class WeatherUtil {Resourceprivate GdCon…

如何使用Python在企业微信中发送测试结果?操作看这里!

在日常的自动化测试工作中,一般会需要把测试结果同步到工作群里,方便信息同步。那么我们今天就使用企业微信和Pythonrequests库来演示一下具体如何操作吧! 01 准备 开始之前,我们应该确保已经安装了python环境,并且要…

【Java16】多态

向上类型转换 对于引用变量,在程序中有两种形态:一种是编译时类型,这种引用变量的类型在声明它的时候就决定了;另一种则是运行时类型,这种变量的类型由实际赋给它的对象决定。 当一个引用变量的编译时类型和运行时类…

LabVIEW电容器充放电监测系统

概述 为了对车用超级电容器的特性进行研究,确保其在工作时稳定可靠并有效发挥性能优势,设计了一套车用超级电容器充放电监测系统。该系统通过利用传感器、USB数据采集卡、可调直流稳压电源、电子负载以及信号调理电路,完成对各信号的采集和超…

jdevelope安装

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

Codeforces Round 954 (Div. 3)(A~D题)

A. X Axis 思路: 1~10暴力枚举一下所有可能 代码: #include<bits/stdc.h> using namespace std; #define N 1000005 typedef long long ll; typedef unsigned long long ull; ll n, m, t, h, k; ll a, b, c; ll ans, num, sum, cnt; ll temp[N], f1[N], f2[N]; bool f…

Nature Communications|柔性无感智能隐形眼镜(柔性传感/可穿戴电子/柔性电子)

南京大学徐飞(Fei Xu)、陆延青(Yanqing Lu)、陈烨(Ye Chen)和江苏省人民医院袁松涛(Songtao Yuan)团队,在《Nature Communications》上发布了一篇题为“Frequency-encoded eye tracking smart contact lens for human–machine interaction”的论文。论文内容如下: 一、 摘…

科普文:一天学会shell编程

1.shell概叙 本文将从shell执行、语法、实战三个方面来讲解shell编程&#xff0c;其实shell编程就是个批处理&#xff0c;将你平时在服务器上单独执行的命令&#xff0c;按照一定要求组织起来&#xff0c;写在一起&#xff0c;然后统一执行&#xff0c;就完事了。 对于运维人员…

基于Android平台开发,仿头条新闻app

相关视频教程在某站上面(&#x1f50d;浩宇软件开发) 1. 项目模块功能思维导图 2. 项目涉及到的技术点 数据来源&#xff1a;聚合数据API使用okhttp网络请求框架获取api数据使用gson库解析json数据使用RecyclerViewadapter实现新闻列表使用SQLite数据库实现用户登录&#xff0…

【thingsbord源码编译】 显示node内存不足

编译thingsbord显示报错 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory问题原因分析 重新安装java版本 编译通过

小程序多次扫描获取sence失败------ivx

扫码图片被告知侵权了&#xff0c;删除了&#xff0c;如果有需要的同学可以自己尝试。或者直接联系我。 在微信小程序里面有一个函数 wx.getEnterOptionsSync() 功能描述 获取本次小程序启动时的参数。如果当前是冷启动&#xff0c;则返回值与 App.onLaunch 的回调参数一致&am…

前端最全面试题【最新版本2024-7月】

文章目录 最常见问题javascript篇Javascript的运行机制javascript的数据类型怎样判断变量的类型数据类型转换闭包的优缺点v-if和v-for哪个优先级更高&#xff1f; 如果两个同时出现&#xff0c;应该怎么优化得到更好的性能&#xff1f;HTML5的新特性和CSS3的新特性div 上下居中…

SpringBoot注解--11--@JSONField @JsonProperty

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一个问题&#xff1a;后端实体类isXXX开头的属性&#xff0c;传到前端后自动去掉is解决方法&#xff1a; JsonProperty和JSONField1.简介2.注解的区别2.1 底层框架不…