标签: flatbuffers

Protocol Buffers和Flatbuffers之间有什么区别?

两者都是序列化库,由Google开发人员开发.他们之间有什么大不同吗?将代码从协议缓冲区转移到FlatBuffers是一项艰苦的工作吗?

protocol-buffers flatbuffers

101
推荐指数
1
解决办法
4万
查看次数

Protobuf vs Flatbuffers vs Cap'n proto 哪个更快?

我决定找出 Protobuf、Flatbuffers 和 Cap'n proto 中的哪一个是我的应用程序最好/最快的序列化。在我的情况下,通过网络发送某种字节/字符数组(我序列化为该格式的原因)。所以我对所有三个都做了简单的实现,其中我对一个字符串、一个浮点数和一个整数进行了序列化和反序列化。这给出了意想不到的结果:Protobuf 是最快的。我会称它们为意外,因为 cap'n proto 和 flatbuffes 都“声称”是更快的选择。在我接受这一点之前,我想看看我是否无意中在我的代码中作弊。如果我没有作弊,我想知道为什么 protobuf 更快(究竟为什么可能是不可能的)。对于 cap'n proto 和 faltbuffers 来说,这些消息是否可以简单到真正让它们大放异彩?

我的时间:

flatbuffers 所用
时间:14162 微秒 capnp 所用
时间:60259 微秒protobuf 所用时间:12131 微秒
(显然这些取决于我的机器,但重要的是相对时间)

平面缓冲区代码:

int main (int argc, char *argv[]){
    std::string s = "string";
    float f = 3.14;
    int i = 1337;

    std::string s_r;
    float f_r;
    int i_r;
    flatbuffers::FlatBufferBuilder message_sender;

    int steps = 10000;
    auto start = high_resolution_clock::now(); 
    for (int j = 0; j < steps; j++){
        auto autostring = …
Run Code Online (Sandbox Code Playgroud)

c++ protocol-buffers flatbuffers capnproto

15
推荐指数
1
解决办法
8247
查看次数

我们如何将gRPC与Flatbuffers一起使用?

我一直在研究Apache Thrift,ProtoBuf和Flatbuffers.我发现教程在链接中使用带有protobuf的gRPC,但我没有找到任何使用gRPC和Flatbuffers的文档.有人可以指点我的相关文件吗?我在谷歌和Stackoverflow上查了一下.任何帮助,将不胜感激.

flatbuffers grpc

14
推荐指数
2
解决办法
3249
查看次数

具有多个标志的target_compile_definitions

我正在尝试更改flatbuffers库 CMakeLists.txt以使PUBLIC有一些标志.然后,我重写了这些内容:

原始代码

elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x -Wall -pedantic -Werror -Wextra") 
endif()
Run Code Online (Sandbox Code Playgroud)

新代码

elseif(CMAKE_COMPILER_IS_GNUCXX OR "${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    target_compile_definitions(flatbuffers PUBLIC "-std=c++0x -Wall -pedantic -Werror -Wextra")
endif()
Run Code Online (Sandbox Code Playgroud)

目标名称是flatc,当我开始构建项目时,我会收到:

Scanning dependencies of target flatc
[  7%] Building CXX object CMakeFiles/flatc.dir/src/idl_parser.cpp.obj
<command-line>:0:1: error: macro names must be identifiers
Run Code Online (Sandbox Code Playgroud)

使用这些标志将"set(CMAKE_CXX_FLAGS)"转换为"target_compile_definitions()"是错误的吗?

c++ gcc cmake flatbuffers

11
推荐指数
1
解决办法
1万
查看次数

FlatBuffers:写入和读取二进制文件?

我对C++和Google FlatBuffers中的文件流有基本了解.Schema文件非常简单,还可以创建缓冲区并从缓冲区指针读取.我没有得到的是如何将多个缓冲区保存到二进制文件中,然后读取该二进制文件以获取任何随机缓冲区.

这是一个带有两个浮点数的简单Schema:

table Car {
    field_a:[float];
    field_b:[float];
}
Run Code Online (Sandbox Code Playgroud)

.

用于构建缓冲区的函数(尽管没有保存文件):

bool save_flatbuf(string file_path, vector<double> vec_a, vector<double> vec_b) {
    flatbuffers::FlatBufferBuilder builder;

    auto vec_floats_a = builder.CreateVector(vec_a, vec_a.size());
    auto vec_floats_b = builder.CreateVector(vec_b, vec_b.size());

    auto mloc = CreateCar(builder, &vec_floats_a, &vec_floats_b);

    builder.Finish(mloc);

    // How to save it into a binary file with a list of "Cars"?
}
Run Code Online (Sandbox Code Playgroud)

.

还有一个从二进制文件中读取缓冲区后读取缓冲区的函数(没有文件读取):

bool read_flatbuf(string file_path) {

    // How to get the buffer pointer to a "Car" from a binary file with a "list of Cars" ? …
Run Code Online (Sandbox Code Playgroud)

c++ serialization fstream binaryfiles flatbuffers

10
推荐指数
1
解决办法
5673
查看次数

Flatbuffers与CBOR

请帮助建议Flatbuffers和CBOR协议的优缺点。这两种二进制格式都声称在它们的网站上是不错的,但是我无法在两者之间做出一些很好的区别。

平面缓冲区:

优点:

  1. 严格输入FlatBuffer,Cap'n proto和其他类似解决方案被视为提高性能的关键点,因为不需要额外的编码/解码。
  2. 数据模型允许使用紧凑的数据结构和快速访问轻松地对类型化的对象进行偏移
  3. FlatBuffers不需要解析/拆包步骤即可生成辅助表示形式,然后您才能访问经常与按对象存储分配相关的数据。

坏处:

  1. 像CBOR一样新的和不标准化的

CBOR

优点:

  1. 可以完全在流中创建和处理而无需额外的内存
  2. 不必预先定义任何模式,因为我们的数据是动态的且可变的
  3. 这是IETF的一项开放国际标准,因此比专有标准更好。
  4. 它设计用于低内存,非转换,基于流的处理,同时还提供其他数据类型的扩展

坏处:

  1. CBOR表示它遵循JSON模型(因此不是严格类型的对象)
  2. 它以相同类型的对象(字符串,整数,映射等)开头。

PS:
与平缓缓冲区相比,感觉CBOR中的类型管理将在性能上付出高昂的代价,但是由于CBOR是标准化协议,因此如果这种差异不大,我倾向于使用它。请让我知道你们都推荐两个,为什么。

json protocol-buffers cbor flatbuffers capnproto

8
推荐指数
3
解决办法
2242
查看次数

如何以正确的方式在 python 中使用 flatbuffers?

我有两个关于在 python 中使用 flatbuffers 的问题,重点是如何以正确的方式使用它们而不编写完全破坏其性能优势的代码。我想使用 flatbuffers 在 C# 和 python 程序之间进行序列化和网络通信。我已经阅读了教程、python 细节和一些使用其他语言和平面缓冲区的博客文章,但找不到适用于 python 的语言。

1.) Flatbuffers 用于快速序列化。这对python来说是真的吗?python的性能只是指出“好的”,而其他语言则“很棒”。具体时间不详。我知道 python 通常不如 C 或 C++ 快,但我们说的有多慢?达到它所承诺的性能优势(例如与 JSON 相比)的地步?也许有人已经用 python 做了一个基准测试?如果没有,我将尝试编写一个比较 C# 和 python 之间的时间以及 python 中 flattbuffers 与 json 的比较。

2.) 它很快,因为“零拷贝”。但这对于需要更改数据的程序意味着什么?特别是因为对象是不可变的。为了使用它们,我需要将值复制到对象的本地表示中。不打败那个目的吗?本教程说明了从 flatbuffer 读取的示例:

import MyGame.Example as example
import flatbuffers
buf = open('monster.dat', 'rb').read()
buf = bytearray(buf)
monster = example.GetRootAsMonster(buf, 0)
hp = monster.Hp()
pos = monster.Pos()
Run Code Online (Sandbox Code Playgroud)

最后两行不就是副本吗?

python flatbuffers

8
推荐指数
2
解决办法
4826
查看次数

FlatBuffers:如何编写巨型文件

我正在尝试使用FlatBuffers来存储OpenStreetMap数据.所以,这将是50GB.

由于通常所有内容都保存在内存中,如何将数据顺序写入文件是否可能(如果有的话)?

我有一种感觉,这不是FlatBuffers有用的地方.

c++ flatbuffers

7
推荐指数
1
解决办法
1305
查看次数

使用打字稿正确导入平面缓冲区

在打字稿中,我使用的是这样的 flatbuffers:

import {flatbuffers} from 'flatbuffers';
const builder = new flatbuffers.Builder(1);
Run Code Online (Sandbox Code Playgroud)

然后我编译为 js 以与 react-native 一起使用:

const flatbuffers_1 = require("flatbuffers");
const builder = new flatbuffers_1.flatbuffers.Builder(1);
Run Code Online (Sandbox Code Playgroud)

但我收到错误:

undefined is not an object (evaluating 'new flatbuffers_1.flatbuffers.Builder')
Run Code Online (Sandbox Code Playgroud)

发生什么事?

javascript typescript flatbuffers react-native

7
推荐指数
1
解决办法
464
查看次数

FlatBuffers:使用联盟发送多个数据包类型

我将通过连接发送多种缓冲区类型.为了简单起见,想象一下这样的架构:

namespace MyEvents;  

table EventOne  
{  
  id:uint;  
  timestamp:ulong;  
  adress:string;  
}  

table EventTwo  
{  
  id:uint;  
  timestamp:ulong; 
  strength:float;   
}  

union Events {EventOne, EventTwo}  

table EventHolder  
{  
  theEvent:Events;  
}  

root_type EventHolder;  
Run Code Online (Sandbox Code Playgroud)

我为C++和C#生成了所需的文件,并在我各自的项目中根据需要包含它们.

以下是我在C++中编码事件的方法 - 这里是EventOne类型的事件:

...  
uint32_t anId(645);  
uint64_t aTimestamp(1234567);  
string anAddress("00::00::45::56::47::e5");  

flatbuffers::FlatBufferBuilder builder;  
auto addressOffset= builder.CreateString(anAddress);  
auto eventOneOffset= MyEvents::CreateEventOne(builder, anId, aTimestamp, addressOfset);   

// Here is where I am confused - how to create the EventHolder object.  
// Original code I posted about - commented out, but has error.
//auto eventHolderOffset= MyEvents::CreateEventHolder(builder, MyEvents::Events_EventOne, …
Run Code Online (Sandbox Code Playgroud)

c# c++ flatbuffers

6
推荐指数
1
解决办法
1754
查看次数