Devo usar um binário ou um arquivo de texto para armazenar mensagens protobuf?

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

  •  13-09-2019
  •  | 
  •  

Pergunta

Usando o Google protobuf, estou salvando meus dados enviado mensagens serializados para um arquivo - em cada arquivo existem várias mensagens. Temos tanto versões Python do código C ++ e, por isso, eu preciso usar funções protobuf que estão disponíveis em ambas as línguas. Eu experimentei com o uso SerializeToArray e SerializeAsString e parece haver as seguintes condições infelizes:

  1. SerializeToArray: Como sugerido em uma resposta, a melhor maneira de usar este é prefixar cada mensagem com o seu tamanho de dados. Este seria um grande trabalho para C ++, mas em Python que não se parece com isso é possível - estou errado

  2. ?
  3. SerializeAsString: Isso gera uma string serializada equivalente a isso de contraparte binário - que eu posso salvar em um arquivo, mas o que acontece se um dos personagens no resultado da serialização é \ n - como podemos encontrar finais de linha, ou o término de mensagens para que o assunto?

Update:

Por favor, permita-me reformular ligeiramente. Pelo que entendi, eu não consigo gravar dados binários em C ++, porque então a nossa aplicação Python não consegue ler os dados, uma vez que pode corda só parse serializado mensagens. Devo então, em vez usar SerializeAsString em C ++ e Python? Se sim, então é melhor prática para armazenar esses dados em um arquivo de texto em vez de um arquivo binário? Minha intuição é binário, mas como você pode ver isso não parece ser uma opção.

Foi útil?

Solução

A melhor prática para concatenar as mensagens desta forma é para preceder cada mensagem com o seu tamanho. Dessa forma, você leu no tamanho (tentar um int de 32 bits ou algo assim), em seguida, ler esse número de bytes em um buffer e desserializar-lo. Então leia o próximo tamanho, etc. etc.

O mesmo vale para a escrita, você primeiro escrever o tamanho da mensagem, em seguida, a própria mensagem.

Streaming de várias mensagens sobre a documentação protobuf por mais informações.

Outras dicas

Temos tido grande sucesso base64 que codificam as mensagens e usando um simples \ n para mensagens separadas. Este ofcoirse vai depender muito do seu uso - precisamos para armazenar as mensagens em arquivos de "log". É, naturalmente, tem codificação sobrecarga / decodificação isso -. Mas isso não tem sido nem remotamente um problema para nós

A vantagem de manter essas mensagens como linha separada texto até agora tem sido inestimável para manutenção e depuração. Descobrir quantas mensagens estão em um arquivo? wc -l. Encontre a mensagem Nth - head ... | tail. Descobrir o que há de errado com um registro em um sistema remoto que você precisa para acesso através de 2 VPNs e uma solução Citrix? copiar e colar a mensagem e enviá-lo para o programador.

Protobuf é um formato binário, de modo que a leitura ea escrita deve ser feito como binário, não texto. Se você não quiser formato binário, você deve considerar o uso de algo diferente de protobuf (existem muitos formatos de dados textuais, como XML, JSON, CSV); apenas usando abstrações texto não é suficiente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top