2016-07-15 7 views
9

Ich habe eine pandas dataframe, um als Flask Response Objekt in einer flask Anwendung zurückgegeben werden. Derzeit bin Umwandlung ich es zu einem JSON Object,Wie serialisiert/deserialisiert Pandas DataFrame in und von ProtoBuf/Gzip in einer RESTful Flask App?

df = df.to_json() 
return Response(df, status=200, mimetype='application/json') 

Die Datenrahmen Größe ist wirklich riesig von der Größe, wahrscheinlich 5000000 X 10. Auf der Client-Seite, wenn ich deserialisieren es wie

df = response.read_json() 

Wie Meine Nummer URL request parameters wächst, die dataframe wächst auch. Die Deserialisierungszeit wächst bei linear factor im Vergleich zur Serialisierung, die ich vermeiden möchte. Beispiel: Serialization dauert 15-20 Sekunden, deserialization dauert 60-70 Sekunden.

Gibt es eine Möglichkeit, protobuf kann in diesem Fall helfen Pandas Dataframe in ein Protobuf-Objekt zu konvertieren. Gibt es auch eine Möglichkeit, dass ich diese JSON als Gunzipped Mimetype durch Flasche senden kann? Ich glaube, dass es zwischen protobuf und gunzip ein vergleichbares Timing und eine vergleichbare Effizienz gibt.

Was ist die beste Lösung in einem solchen Szenario?

Vielen Dank im Voraus.

Antwort

1

Ich lief in letzter Zeit das gleiche Problem. Ich löste es, indem ich die Zeilen meines DataFrame durchlaufen und protobuf_obj.add() in dieser Schleife mit Informationen aus dem DataFrame aufruft. Sie können dann die serialisierte Stringausgabe mit GZIP versehen.

das heißt etwas entlang der Linien von:

for _, row in df.iterrows(): 
    protobuf_obj.add(val1=row[col1], val2=row[col2]) 
proto_str = protobuf_obj.SerializeToString() 
return gzip.compress(proto_str) 

Da diese Frage in 9 Monaten beantwortet wurde nicht, ich bin nicht sicher, dass eine bessere Lösung gibt es aber auf jeden Fall offen für eine Anhörung, wenn es!