2017-09-05 5 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에 대한 캐스트가 proto 유형과 독립적이므로 도움이되지 않는다고 생각합니다.)하지만 "double"을 사용하면 작동합니다. 지에 루오 파이썬의 부동 실제로 이미 배정 밀도를 가지고, 코멘트에 설명으로

그래서, 나는,

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

배경이되는

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

을 변경했습니다. C 스타일 플로트가 없습니다. 반면 Protobuf는 "float"과 "double"을 다른 유형으로 인식합니다. Protobuf의 double 타입을 사용하는 것은 실제로 Python의 부동 소수점과 동일하지만 Protobuf의 부동 소수점은 정밀도를 떨어 뜨리므로 문제에 설명 된 문제가 발생합니다.

1

순수한 python protobuf의 경우, python-float가 float 및 double에 사용됩니다. 그러나 cpp 구현은 C++ protobuf 코드를 호출하고 순수한 파이썬과는 다른 것으로 만듭니다.

+0

정보 주셔서 감사합니다. 당신은 정교 할 수 있습니까? Python float가 C++ float보다 많은 바이트로 인코딩 되었습니까? (나는 둘 다 32 바이트로 인코딩되어 있다고 생각하니?) "cpp"는 무엇입니까? 그것은 C++ 컴파일러입니까? – Make42

+2

파이썬에는 C 스타일의 부동 소수점이 없으며 C 스타일의 이중 만 있습니다. 파이썬의 빌트인 float 형은 배정 밀도를 가진다. 예 "cpp"에 의해 나는 C++을 의미합니다. "--cpp_implementation"은 누군가가 C++ 구현을 사용하고자한다면 파이썬 protobuf에 사용 된 플래그입니다 : 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 자체는 기본 설치를 사용하며 만족스럽지 만 발생하는 경미한 동작 차이가있을 수 있습니다. PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION = python 환경 변수가있어 C++ 확장을 사용할 수있을 때에도 순수한 파이썬 코드 경로를 강제 적용합니다. –