2014-07-10 2 views
6

Ich bin derzeit Schnittstelle zu einem Server, der Protokollpuffer bereitstellt. Ich kann möglicherweise eine sehr große Anzahl von Nachrichten erhalten. Derzeit ist mein Prozess die Protokollpuffer und wandeln sie in einem Pandas Datenrahmen zu lesen (nicht ein notwendiger Schritt im Allgemeinen, aber Pandas bietet schöne Werkzeuge zur Analyse von Datensätzen) ist:Erstellen eines Python-Wörterbuchs wie Objekt aus Protokollpuffern zur Verwendung in Pandas

  1. lesen Protokollpuffer, wird es eine Google protobuf sein
  2. Convert Protokollpuffer Objekt pandas.DataFrame.from_records mit protobuf_to_dict
  3. Gebrauch Wörterbuch a Dataframe

Dies funktioniert gut, aber angesichts der großen Anzahl von Nachrichten, die ich aus dem protobuf lesen zu bekommen, ist es ziemlich ineffizient c wandle zum Wörterbuch und dann zu Pandas. Meine Frage ist: Ist es möglich, eine Klasse zu erstellen, die ein Python-Protobuf-Objekt wie ein Wörterbuch aussehen lässt? Das heißt, entfernen Sie Schritt 2. Alle Referenzen oder Pseudocode wäre hilfreich.

+1

Aber 'Protokollpuffer Konvertieren in dictionary' macht einen Python protobuf Objekt wie ein Wörterbuch aussehen;) Sie lieber etwas' pandas.DataFrame.from_protbuf' brauchen, aber ich weiß nicht, Antwort für dieses Problem. – furas

+1

Ich habe mir den Code angeschaut, er sieht definitiv nicht so aus, als würde er das protobuf-Objekt umhüllen, sondern erzeugt ein wirklich neues Wörterbuch. Ich glaube @Justin sucht nach etwas, das nur umschließt, ohne Daten zu kopieren. – user3820547

+0

Ja, ich möchte das google protobuf-Objekt wie ein Wörterbuch aussehen lassen, anstatt die Daten zuerst nach python dict zu kopieren. – Justin

Antwort

3

Vielleicht möchten Sie das ProtoText Python-Paket überprüfen. Es bietet direkte diktierähnliche Operation für den Zugriff auf Ihr Protobuf-Objekt.

Beispielverwendung: Angenommen, Sie haben ein Python-Protobuf-Objekt person_obj.

import ProtoText 
print person_obj['name']  # print out the person_obj.name 
person_obj['name'] = 'David' # set the attribute 'name' to 'David' 
# again set the attribute 'name' to 'David' but in batch mode 
person_obj.update({'name': 'David'}) 
print ('name' in person_obj) # print whether the 'name' attribute is set in person_obj 
# the 'in' operator is better than the google implementation HasField function 
# in the sense that it won't raise Exception even if the field is not defined 
Verwandte Themen