Dovrei usare un binario o un file di testo per la memorizzazione di protobuf messaggi?

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

  •  13-09-2019
  •  | 
  •  

Domanda

Utilizzo di Google protobuf, sto salvando i miei dati messaged serializzato in un file - in ogni file ci sono diversi messaggi. Abbiamo entrambe le versioni C ++ e Python del codice, quindi ho bisogno di utilizzare le funzioni protobuf che sono disponibili in entrambe le lingue. Ho sperimentato con l'utilizzo di SerializeToArray e SerializeAsString e non ci sembra essere le seguenti condizioni sfavorevoli:

  1. SerializeToArray: Come suggerito in una risposta, il modo migliore per utilizzare questo è quello di prefisso ogni messaggio con la sua dimensione dei dati. Questo grande lavoro per C ++, ma in Python non sembra come questo è possibile - mi sbaglio

  2. ?
  3. SerializeAsString: Questo genera una stringa serializzata equivalente alla sua controparte binario - che posso salvare in un file, ma cosa succede se uno dei caratteri nel risultato serializzazione \ n - Come facciamo a trovare fine riga, o la fine di messaggi per quella materia?

Aggiornamento:

Mi permetta di riformulare un po '. A quanto ho capito, non riesco a scrivere dati binari in C ++ perché allora la nostra applicazione Python non può leggere i dati, dal momento che può analizzare solo stringhe messaggi serializzati. Dovrei poi invece utilizzare SerializeAsString sia in C ++ e Python? Se sì, allora è buona norma memorizzare tali dati in un file di testo piuttosto che un file binario? La mia sensazione è binario, ma come si può vedere questo non sembra un'opzione.

È stato utile?

Soluzione

La pratica migliore per concatenare i messaggi in questo modo è quello di anteporre ogni messaggio con le sue dimensioni. In questo modo si legge nelle dimensioni (provare un'int a 32 bit o qualcosa del genere), quindi leggere il numero di byte in un buffer e deserializzare esso. Poi leggi la dimensione successiva, ecc ecc.

Lo stesso vale per la scrittura, per la prima volta scrive la dimensione del messaggio, quindi il messaggio stesso.

streaming di messaggi multipli sulla documentazione protobuf per più informazioni.

Altri suggerimenti

Abbiamo avuto grandi base64 successo che codificano per i messaggi, e utilizzando un semplice \ n per separare i messaggi. Ciò ofcoirse dipenderà molto per l'utilizzo - abbiamo bisogno di memorizzare i messaggi in file "log". Esso ha naturalmente codifica sovraccarico / decodifica questo -., Ma questo non è stato anche lontanamente un problema per noi

Il vantaggio di mantenere questi messaggi come linea separata testo è stato finora prezioso per la manutenzione e il debugging. Capire quanti messaggi sono in un file? wc -l. Trovare il messaggio ennesimo - head ... | tail. Capire cosa c'è che non va con un record su un sistema remoto è necessario accedere attraverso 2 VPN e soluzione Citrix? copia incolla il messaggio e spedirlo al programmatore.

Protobuf è un formato binario, così la lettura e la scrittura dovrebbe essere fatto come binario, non il testo. Se non si desidera formato binario, si dovrebbe considerare l'utilizzo di qualcosa di diverso da protobuf (ci sono un sacco di formati di dati testuali, quali XML, JSON, CSV); usando solo le astrazioni di testo non è sufficiente.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top