2016-07-15 11 views
9

Tôi có một pandas dataframe để được trả lại dưới dạng đối tượng Flask Response trong ứng dụng flask. Hiện nay tôi đang chuyển đổi nó vào một JSON Object,Làm thế nào để tuần tự hóa/deserialize Pandas DataFrame đến và đi từ ProtoBuf/Gzip trong một ứng dụng bình tĩnh RESTful?

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

Kích thước dataframe thực sự khổng lồ về tầm quan trọng, có lẽ 5000000 X 10 Về phía khách hàng khi tôi deserialize nó như là,

df = response.read_json() 

Như số của tôi về số lượng URL request parameters tăng lên, số lượng dataframe cũng tăng lên. Thời gian Deserialization phát triển tại một linear factor so với serialization, mà tôi muốn tránh. ví dụ: Serialization mất 15-20 giây, deserialization mất 60-70 giây.

Có cách nào mà protobuf có thể trợ giúp trong trường hợp này để chuyển đổi khung dữ liệu gấu trúc thành đối tượng protobuf. Ngoài ra, có cách nào để tôi có thể gửi JSON này làm Gunzipped mimetype qua bình? Tôi tin rằng có thời gian và hiệu quả tương đương giữa protobufgunzip.

Giải pháp tốt nhất trong trường hợp như vậy là gì?

Xin cảm ơn trước.

Trả lời

1

Gần đây tôi đã gặp sự cố tương tự. Tôi đã giải quyết nó bằng cách lặp qua các hàng của DataFrame và gọi protobuf_obj.add() trong vòng lặp đó, sử dụng thông tin từ DataFrame. Sau đó bạn có thể GZIP đầu ra chuỗi được tuần tự hóa.

ví dụ: một cái gì đó dọc theo dòng:

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

Cho rằng câu hỏi này chưa được trả lời trong 9 tháng, tôi không chắc chắn có một giải pháp tốt hơn nhưng chắc chắn mở được nghe một nếu có!

Các vấn đề liên quan