Protobuf 메시지를 저장하기 위해 바이너리 또는 텍스트 파일을 사용해야합니까?

StackOverflow https://stackoverflow.com/questions/1859267

  •  13-09-2019
  •  | 
  •  

문제

Google Protobuf를 사용하여 직렬화 된 메시지 데이터를 파일에 저장하고 있습니다. 각 파일에는 여러 메시지가 있습니다. 우리는 C ++ 및 Python 버전의 코드를 모두 가지고 있으므로 두 언어로 제공되는 Protobuf 함수를 사용해야합니다. SerializetoArray 및 Serializeasstring을 사용하는 실험을 수행했으며 다음과 같은 불행한 조건이있는 것 같습니다.

  1. SerializetoArray : 한 가지 답변에서 제안한 바와 같이, 이것을 사용하는 가장 좋은 방법은 각 메시지를 데이터 크기로 접두사하는 것입니다. 이것은 C ++에 적합하지만 파이썬에서는 이것이 가능한 것처럼 보이지 않습니다. 내가 틀렸습니까?

  2. SerializeAsString : 이진에 해당하는 직렬화 된 문자열을 생성합니다. 파일에 저장할 수 있지만 직렬화 결과의 문자 중 하나가 n이면 어떻게되는지 또는 메시지 종료를 찾는 방법은 무엇입니까? 그 문제?

업데이트:

약간 다시 표현할 수 있습니다. 이해할 수 있듯이 Python 응용 프로그램은 문자열 직렬화 된 메시지 만 구문 분석 할 수 있기 때문에 Python 응용 프로그램이 데이터를 읽을 수 없기 때문에 C ++에 이진 데이터를 쓸 수 없습니다. 그런 다음 대신 사용해야합니다 SerializeAsString C ++와 Python 모두에서? 그렇다면 이진 파일이 아닌 텍스트 파일에 그러한 데이터를 저장하는 것이 가장 좋은 관행입니까? 내 직감은 이진이지만, 알 수 있듯이 이것은 옵션처럼 보이지 않습니다.

도움이 되었습니까?

해결책

이러한 방식으로 메시지를 연결하기위한 모범 사례는 각 메시지를 크기로 전제하는 것입니다. 그렇게하면 크기로 읽은 다음 (32 비트 int 또는 무언가를 시도한 다음 해당 바이트 수를 버퍼로 읽고이를 제외시킵니다. 그런 다음 다음 크기 등을 읽으십시오.

글쓰기도 마찬가지입니다. 먼저 메시지의 크기를 작성한 다음 메시지 자체를 작성합니다.

보다 여러 메시지 스트리밍 자세한 내용은 Protobuf 문서에서.

다른 팁

우리는 큰 성공을 거두었습니다. Base64는 메시지를 인코딩하고 간단한 메시지를 분리하기 위해 간단한 n을 사용했습니다. 이 OfCoirse는 귀하의 사용에 크게 의존합니다. "로그"파일에 메시지를 저장해야합니다. 그것은 자연스럽게 이것을 인코딩/디코딩하는 오버 헤드를 가지고 있지만 이것은 우리에게는 원격으로 문제가되지 않았습니다.

이러한 메시지를 라인 분리 된 텍스트로 유지하는 이점은 지금까지 유지 보수 및 디버깅에 매우 중요했습니다. 파일에 몇 개의 메시지가 있는지 알아 봅니다. wc -l . N 번째 메시지 찾기 - head ... | tail. 원격 시스템의 레코드에 무엇이 잘못되었는지 파악하십시오. 메시지를 복사하여 프로그래머에게 보내십시오.

Protobuf는 이진 형식이므로 읽기와 쓰기는 텍스트가 아닌 이진으로 수행해야합니다. 이진 형식을 원하지 않으면 protobuf 이외의 것을 사용하는 것을 고려해야합니다 (XML, JSON, CSV와 같은 텍스트 데이터 형식이 많이 있습니다). 텍스트 추상화를 사용하는 것만으로는 충분하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top