сериализованный объект pyarrow через http - PullRequest
0 голосов
/ 23 февраля 2020

Я храню pandas фреймы данных в Redis, сериализуя их, используя pyarrow. Это работает хорошо. Я хочу сделать эти данные доступными для ноутбуков Jupyter через flask. Это прекрасно работает на локальном хосте, но не работает при работе на AWS EB.

Flask код

@app.route('/cacheget/<path:key>', methods=['GET'])
def cacheget(key):
    c = mycache()
    resp = Response(BytesIO(c.redis().get(key)), mimetype="text/plain", direct_passthrough=True)
    resp.headers["key"] = key
    resp.headers["type"] = c.redis().get(f"{key}.type")
    return resp

Тесты Jupyter на flask на локальном хосте и AWS EB enter image description here

Я подозреваю, что существует проблема с неполным содержанием байтов, когда его десериализует pyarrow. Однако я не могу увидеть или найти какие-либо доказательства или найти какие-либо другие сообщения, связанные с этим. Я рассматриваю переключение с сериализованных данных Pyarrow на провод к JSON. то есть в flask route преобразуйте сериализованные байты в pandas и затем в json. Это, однако, будет как минимум в 10 раз больше на проводе.

Правильно ли настроены мои заголовки http для этого? Есть ли какие-либо известные проблемы с отправкой байтовых данных, подобных этой, по проводам?

1 Ответ

0 голосов
/ 25 февраля 2020

Проблема была с несовместимыми версиями pyarrow. AWS Экземпляр EB работал на клиенте jupyter 0.14.1 и 0.16.0. Понизил клиент до 0.14.1 и сбросил кэши Redis на localhost, чтобы pandas фреймы данных сериализовались в локальном кэше Redis с использованием pyarrow 0.14.1. Кодировка base64 не требуется и увеличивает полезную нагрузку как минимум на 20%. Я пришел к такому выводу, выполняя sys.getsizeof () в flask и вставляя заголовки, а затем делая то же самое для байтов, считываемых в jupyter

...