我正在使用grpc发送一些非常大的消息(通过网络的机器学习模型的参数)。问题是,当我进行grpc调用时,我得到以下错误:
grpc: received message larger than max (261268499 vs. 4194304)
在其他帖子中,我试图增加通道和grpc服务器上的最大消息大小,但我一直得到相同的错误。知道怎么让它工作吗?
服务器的代码:
maxMsgLength = 1024 * 1024 * 1024
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10),
options=[('grpc.max_message_length', maxMsgLength),
('grpc.max_send_message_length', maxMsgLength),
('grpc.max_receive_message_length', maxMsgLength)])
客户端:
maxMsgLength = 1024 * 1024 * 1024
channel = grpc.insecure_channel(ip_port,
options=[('grpc.max_message_length', maxMsgLength),
('grpc.max_send_message_length', maxMsgLength),
('grpc.max_receive_message_length', maxMsgLength)])
编辑:
不是解决方案,但也许能让我们更深入地了解问题。由于某种原因,如果我将最大消息大小设置为1024 * 1024 * 1024,那么正如错误消息所暗示的那样,它最终会默认为4194304。不知道为什么会这样。但无论如何,我尝试将最大消息大小减少到1024 * 1024 * 200,它在错误消息(209715200)中显示了正确的最大消息大小。似乎有一个问题,grpc没有正确设置最大消息大小。我不知道该怎么解决这个问题。
我可以使用的最大数字,其中错误消息显示正确的最大值是2^28。如果我设置最大消息大小为2^29,默认为4194304。
您可以使用grpc流API在块中发送数据,如下面的示例所示。虽然,需要更多的细节来更好地明确你的确切需求。
Protobuf文件
syntax = "proto3";
package pb.foo_service;
service FooService {
rpc TestRpc(TestRequest) returns (stream TestResponse) {}
}
message TestRequest {}
message TestResponse {
bytes data = 1;
}
服务机构
class FooService(pb_grpc.FooServiceServicer):
def TestRpc(
self,
request: pb.TestRequest,
context: grpc.ServicerContext
) -> Iterator[pb.TestResponse]:
with open("test_file", 'rb') as content_file:
content = content_file.read()
yield my_generated_module_pb2.Response(data=content)