2017-09-05 17 views
0

我正在使用协议缓冲区与gRPC。我有我的.proto文件看起来像gRPC中的协议缓冲区无法保存大型浮点数 - 该怎么办?

syntax = "proto3"; 

option java_multiple_files = true; 
option objc_class_prefix = "DRPC"; 

package my_rpc; 

service RPCData { 
    // Sends a cycle of data 
    rpc RunRequest (CycleData) returns (OutputScores) {} 
} 

message CycleData { 
    repeated float timestamps = 1; 
    repeated float values = 2; 
} 

但是系统似乎把我的价值观:

>>> dtw_rpc_pb2.CycleData(timestamps=[1501545616.742662], values=[5]) 
timestamps: 1501545600.0 
values: 5.0 

我想这不能代表准确的较大值:

>>> dtw_rpc_pb2.CycleData(timestamps=[16.742662], values=[5]) 
timestamps: 16.74266242980957 
values: 5.0 
>>> dtw_rpc_pb2.CycleData(timestamps=[45616.742662], values=[5]) 
timestamps: 45616.7421875 
values: 5.0 
>>> dtw_rpc_pb2.CycleData(timestamps=[1545616.742662], values=[5]) 
timestamps: 1545616.75 
values: 5.0 
>>> dtw_rpc_pb2.CycleData(timestamps=[1501545616.742662], values=[5]) 
timestamps: 1501545600.0 
values: 5.0 

我该怎么办?

回答

0

documentation有点误导(这意味着对Python-float的转换与原型无关,所以我认为它不会有帮助),但是如果使用“double”,它就会起作用。

所以,我需要改变

message CycleData { 
    repeated float timestamps = 1; 
    repeated float values = 2; 
} 

message CycleData { 
    repeated double timestamps = 1; 
    repeated float values = 2; 
} 

的背景是,作为捷罗解释了评论,Python的浮动居然已有了双精度。没有C型浮球。另一方面,Protobuf确实将“浮动”和“双重”视为不同的类型。使用Protobuf的double类型实际上与Python的float类型相同,而Protobuf的float类型会降低精度,导致问题中描述的问题。

1

对于纯python protobuf,python-float用于float和double。但是cpp实现调用了一些C++ protobuf代码,使它与纯python不同。

+0

谢谢你的信息。你能详细说明吗?是一个比C++ float更多字节编码的python float吗? (我认为两者都是用32字节编码的?)什么是“cpp”?它是C++编译器吗? – Make42

+2

Python没有C风格的浮动,它只有一个C风格的双。 Python的内置浮点类型具有双精度。 是的“cpp”我的意思是C++。 “--cpp_implementation”是我们用于python protobuf的标志,如果有人想使用C++实现:https://github.com/google/protobuf/blob/master/python/README.md 我相信gRPC正在使用cpp_implementation –

+2

@ Make42 gRPC Python pip包,将protobuf pip包列为依赖项。根据你pip安装的平台,Python protobuf包会加载两个底层代码路径之一,一个使用C++编写的Python扩展,另一个使用Python本地编写)。 gRPC本身使用任何潜在的protobuf安装,并且对任何一方都很满意,但是遇到的情况可能会有细微的行为差异。有一个PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = python环境变量,即使在C++扩展可用时也会强制使用纯Python代码路径。 –