gpt4 book ai didi

c++ - 将数据流式传输到 protobuf 解析器 C++

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:45:54 26 4
gpt4 key购买 nike

上下文

我正在用 C++ 编写一个事件驱动的应用程序服务器。我想使用谷歌 Protocol Buffer 来移动我的数据。由于服务器是事件驱动的,连接处理程序 API 基本上是一个回调函数,让我知道另一个 N 字节的缓冲区何时从客户端到达。

问题

作为 protobuf 的完全初学者,我的问题是:是否有可能以某种方式诱使 protobuf 接受构成一条完整消息所需的许多缓冲区,以促进“流解析器”,而不是等待整个数据到达首先是一个临时缓冲区?

换句话说,我想要这个:

//Event API. May be called multiple times for each protobuf message
bool data_arrived_from_client(void *buf,size_t len){
my_protobuf.parse_part(buf,len); // THIS IS THE GROSSLY SIMPLIFIED SEMANTIC OF WHAT I WANT
message_size+=len;
if(message_size>COMPLETE_BUFFER_SIZE){
use_complete_protobuf();
return true;
}
return false;
}

..而不是这个:

//Event API. May be called multiple times for each protobuf message
bool data_arrived_from_client(void *buf,size_t len){
my_temp_buffer.append_data(buf,len);
message_size+=len;
if(message_size>COMPLETE_BUFFER_SIZE){
my_protobuf.ParseFromArray(my_temp_buffer.data_ptr(),my_temp_buffer.size());
use_complete_protobuf();
return true;
}
return false;
}

回答

特别感谢具有完整代码的答案!

最佳答案

不,这是不可能的。

Protobuf 解析器是一个递归下降解析器,这意味着它的相当一部分状态存储在堆栈中。这使得它很快,但这意味着除了暂停整个线程之外没有办法在中间暂停解析器。如果您的应用程序是非阻塞的,您只需缓冲字节,直到您有完整的消息要解析。

也就是说,这并不像听起来那么糟糕。请记住,消息的最终解析表示(即内存中的消息对象)比有线表示大很多。因此,与稍后要处理的内容相比,您几乎不会在缓冲上浪费内存。事实上,在您真正拥有所有数据之前推迟解析实际上可能会节省内存,因为您不会持有一个大的半解析对象,它只是坐在那里等待数据到达。

关于c++ - 将数据流式传输到 protobuf 解析器 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21974718/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com