- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
设想我们在一家很大的互联网公司做IT方面的规划、开发和维护,有以下这样的应用场景:
相信在大公司或者在大公司做过外包的童鞋,都接触过这样一种数据对象,那就是Bond格式,目前Bond由M$维护,官方网站:https://github.com/microsoft/bond/,上面提供了各种语言的示例、编译工具等。 一个基本的Bond文件如下所示:
namespace School
struct Student
{
0: string Name;
1: uint8 Age;
2: bool IsBoy;
3: optional vector<string> Interests;
}
这里定义了一个学校的命名空间,里面有个学生类,学生类里面有四个字段,依次是姓名、年龄、是否为男孩、兴趣爱好的列表(可选).
很容易看出Bond结构实际是与平台和语言无关的,它是一个DSL,在不同的平台上,利用Bond编译工具gbc,可以把Bond文件编译成不同的类,然后就可以赋值、存储和传输了,编译好的Bond原生支持RPC调用.
Bond支持的数据类型有:
这些类型能很好的满足数据交换和存储的需要;除此以外,Bond是一种非常高效的数据存储格式,它的二进制序列化最大程度去除了元数据的影响,极其紧凑,我们来看一个示例:
ListingItem是一个Bond类型,它的结构定义如下:
struct ListingItem
{
1: required uint64 xxxxxxxxx;
2: required uint8 xxxxxxxxx;
3: optional uint16 score;
4: optional vector<xxxx> xxxxxxxxxxx;
5: optional map<xxxxxx, uint16> xxxxxxxxx;
6: optional xxxxxx xxxxxxxxxxx = Exxxxx;
7: optional bool IsDeleted;
8: optional vector<xxxxxxxx> xxxxxxxxList = nothing;
}
由于牵涉到生产环境的真实数据,所以一些字段和引用使用xxxxx来代替了,这个类的大小中等,有各种字段,还有对其它类的引用和集合等等.
我们用随机化的方式生成一百万个类,类里面的字段和引用都不一样,数值都是随机生成的,然后用Bond序列化和Java中带的Gson序列化方式进行序列化后的二进制长度比较,渣代码如下:
@Test
public void ListingItemTest() throws IOException {
int cycleLength = 1000000;
Random random = new Random();
// Create 1000000 listing item
List<ListingItem> items = new ArrayList<>();
for(int i = 0; i < cycleLength; i ++){
ListingItem item = new ListingItem();
// ...
//赋值省略,利用random.nextLong() nextInt()等给字段赋值
// ...
items.add(item);
}
StopWatch stopWatch = new StopWatch();
int length = 0;
stopWatch.start();
//Serialization Bond Object for 1000000 times
for(int i = 0; i < cycleLength; i ++){
byte[] bytes = BondSerializationUtils.serializeBondToBytes(items.get(i), ProtocolType.MARSHALED_PROTOCOL);
length += bytes.length;
}
stopWatch.stop();
System.out.println(String.format("Bond Serialization %d objects cost %d ms, avg length in bytes is %d", cycleLength, stopWatch.getTime(), length / cycleLength));
//Serialization as Json Object
length = 0;
stopWatch.reset();
stopWatch.start();
for(int i = 0; i < cycleLength; i ++){
String json = gson.toJson(items.get(i));
length += json.length();
}
stopWatch.stop();
System.out.println(String.format("Json Serialization %d objects cost %d ms, avg length in string is %d", cycleLength, stopWatch.getTime(), length / cycleLength));
}
在我的破笔记本(10代i5低功耗u)运行结果如下:
Bond Serialization 1000000 objects cost 1392 ms, avg length in bytes is 60
Json Serialization 1000000 objects cost 8837 ms, avg length in string is 310
由于Java字符串getBytes()后和原长度一样,所以我们可以把字符串长度看作二进制数组长度.
多运行几遍代码,可以看到,Bond序列化的速度比Gson序列化的速度快4到5倍,序列化后的大小也只有json的1/5。(使用不同的序列化协议,比如COMPACT_PROTOCOL可以进一步压缩结果大小和序列化时间,速度能比Json序列化快10倍以上) 。
这是个了不起的成绩,如果我们生产环境中每天产生上百亿条数据,这些数据用于各种转换、分析与统计,使用Bond结构存储只有使用字符串存储空间的1/5,能够省下4/5以EB、PB计的存储成本;而且由于数据量的减少,传输和计算的成本也进一步压缩,每年在IT基础设施上的投入能节约上百亿上千亿美元,这些节省的成本最后都是利润.
最后,由于Java平台没有自带二进制序列化框架,我们用.net自带的序列化框架测试下二进制序列化和Json序列化,序列化的类如下:
[Serializable]
public class TAListings
{
public string LxxxxxxxxList { get; set; }
public string Titles { get; set; }
public string CxxxxxxxxxxxxxxList { get; set; }
public string CxxxxxxxxxxxxxxxxList { get; set; }
}
代码如下:
TAListings listings = new TAListings() { CxxxxxxxxxxxxxxxxList= "5033333309:-:73333333333334,34444444442:-:744444444442,54444444449:-:744444444444444448,544444443:-:744444444444444" };
var binSerilization = BinaryHelper.Serialize(listings);
var jsonSerilization = JsonHelper.Serialize(listings);
Console.WriteLine(string.Join(" ", binSerilization.Select(f => f.ToString("x2"))));
Console.WriteLine("Binary Serilization Length: " + binSerilization.Length);
Console.WriteLine();
Console.WriteLine(jsonSerilization);
Console.WriteLine("Json Serilization UTF8 Length: " + Encoding.UTF8.GetByteCount(jsonSerilization));
Console.ReadLine();
结果如截图所示: 可以看到,如果只是普通的类,在.net使用二进制序列化后,反而比json序列化大了不少,增加的长度在二到四倍左右不等,这很反常识,是因为.net二进制序列化需要存储更多的元数据吗?
大家对我的文章有什么问题和建议,都希望能够参与讨论,谢谢大家! 。
最后此篇关于Bond——大数据时代的数据交换和存储格式的文章就讲到这里了,如果你想了解更多关于Bond——大数据时代的数据交换和存储格式的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在运行一个辅助角色,并检查 Azure 上托管的存储中是否存在数据。当我将连接字符串用于经典类型的存储时,我的代码可以正常工作,但是当我连接到 V2 Azure 存储时,它会抛出此异常。 “远程服
在我的应用程序的主页上,我正在进行 AJAX 调用以获取应用程序各个部分所需的大量数据。该调用如下所示: var url = "/Taxonomy/GetTaxonomyList/" $.getJSO
大家好,我正在尝试将我的商店导入我的 Vuex Route-Gard。 路由器/auth-guard.js import {store} from '../store' export default
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我正在使用 C# 控制台应用程序 (.NET Core 3.1) 从 Azure Blob 存储读取大量图像文件并生成这些图像的缩略图。新图像将保存回 Azure,并将 Blob ID 存储在我们的数
我想将 Mlflow 设置为具有以下组件: 后端存储(本地):在本地使用 SQLite 数据库存储 Mlflow 实体(run_id、params、metrics...) 工件存储(远程):使用 Az
我的 Windows 计算机上的本地文件夹中有一些图像。我想将所有图像上传到同一容器中的同一 blob。 我知道如何使用 Azure Storage SDKs 上传单个文件BlockBlobServi
我尝试发出 GET 请求来获取我的 Azure Blob 存储帐户的帐户详细信息,但每次都显示身份验证失败。谁能判断形成的 header 或签名字符串是否正确或是否存在其他问题? 代码如下: cons
这是用于编写 JSON 的 NeutralinoJS 存储 API。是否可以更新 JSON 文件(推送数据),而不仅仅是用新的 JS 对象覆盖数据。怎么做到的??? // Javascript
我有一个并行阶段设置,想知道是否可以在嵌套阶段之前运行脚本,所以像这样: stage('E2E-PR-CYPRESS') { when { allOf {
我想从命令行而不是从GUI列出VirtualBox VM的详细信息。我对存储细节特别感兴趣。 当我在GUI中单击VM时,可以看到包括存储部分在内的详细信息: 但是到目前为止,我还没有找到通过命令行执行
我有大约 3500 个防洪设施,我想将它们表示为一个网络来确定流动路径(本质上是一个有向图)。我目前正在使用 SqlServer 和 CTE 来递归检查所有节点及其上游组件,只要上游路径没有 fork
谁能告诉我 jquery data() 在哪里存储数据以及何时删除以及如何删除? 如果我用它来存储ajax调用结果,会有性能问题吗? 例如: $("body").data("test", { myDa
有人可以建议如何为 Firebase 存储中的文件设置备份。我能够备份数据库,但不确定如何为 firebase 存储中的文件(我有图像)设置定期备份。 最佳答案 如何进行 Firebase 存储的本地
我最近开始使用 firebase 存储和 firebase 功能。现在我一直在开发从功能到存储的文件上传。 我已经让它工作了(上传完成并且文件出现在存储部分),但是,图像永远保持这样(永远在右侧加载)
我想只允许用户将文件上传到他们自己的存储桶中,最大文件大小为 1MB,仍然允许他们删除文件。我添加了以下内容: match /myusers/{userId}/{allPaths=**} { al
使用生命周期管理策略将容器的内容从冷访问层移动到存档。我正在尝试以下策略,希望它能在一天后将该容器中的所有文件移动到存档层,但事实并非如此在职的。我设置了选择标准“一天未使用后”。 这是 json 代
对于连接到 Azure 存储端点,有 http 和 https 两个选项。 第一。 https 会带来开销,可能是 5%-10%,但我不支付同一个数据中心的费用。 第二。 http 更快,但 Auth
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
我是一名优秀的程序员,十分优秀!