Попытка придумать решение для быстрой сериализации и длительного хранения данных Pandas.Содержимое фрейма данных является табличным, но предоставляется пользователем, может быть произвольным, поэтому могут быть как полностью текстовые столбцы, так и полностью числовые / логические столбцы.
Основные цели:
Сериализациядатафрейм как можно быстрее, чтобы выгрузить его на диск.
Используйте формат, который я позже смогу загрузить с диска обратно в фрейм данных.
Ну, наименьший объем памяти, занимаемый сериализацией и компактным выходным файлом.
Проведены тесты сравнения различных методов сериализации, в том числе:
- Паркет:
df.to_parquet()
- Перо:
df.to_feather()
- JSON:
df.to_json()
- CSV:
df.to_csv()
- PyArrow:
pyarrow.default_serialization_context().serialize(df)
- PyArrow.Table:
pyarrow.default_serialization_context().serialize(pyarrow.Table.from_pandas(df))
Скорость сериализации и объем памяти при этом, вероятно, являются главными факторами (читайте: избавьтесь от данных, сбросьте их на диск как можно скорее).
Как ни странно, в наших тестах сериализация pyarrow.Table
кажется наиболее сбалансированной и довольно быстрой.
Вопросы:
Есть ли что-то, чего мне не хватает в понимании разницы между сериализацией данных напрямую с использованием PyArrow и сериализацией pyarrow.Table
, таблица светит, если кадры данных в основном состоят из строк, которыев наших случаях это часто случается.
Является ли pyarrow.Table
допустимым параметром для длительного хранения данных?Кажется, «просто работает», но в основном люди просто придерживаются Паркет или что-то еще.
Паркет / перо так же хороши, как pyarrow.Table с точки зрения объема памяти / хранения, нодовольно медленно на полутекстовых фреймах данных (в 2-3 раза медленнее).Могу ли я сделать что-то не так?
В случае фреймов данных смешанного типа JSON по-прежнему выглядит как вариант в соответствии с нашими тестами.
Я могу предоставить цифры, если это необходимо.