Прикольный трюк: сжатие csv файлов 'на лету' в pandas
Pandas - великолепный инструмент для работы с данными в python, а csv - де-факто стандартный формат хранения данных в Data Science (да и много где еще).
Однако, csv файлы могут занимать ооочень много места. Если Вы сохраняете какие-то промежуточные данные или регулярно делаете выгрузки из СУБД, то и количество этих файлов может быстро расти.
Если Вам приходится часто двигать файлы через сеть между различными окружениями - сервера/рабочая станция/Google Colab/Kaggle, то этот процесс может превратиться в настоящую головную боль. Большие файлы долго передаются по сети, дисковое пространство в сервисах быстро заканчивается и они начинают требовать от Вас апгрейдить аккаунт и расширять лимиты.
Но есть решение, причем удивительно простое и удобное.
Итак, у нас есть относительно большой csv файл.
Откроем наш файл на 226MB в pandas:
Как видно, данные тут очень разные: много интов, флоатов, есть также строки. Строки бывают как небольшие, так и приличные json объекты на несколько килобайт.
Теперь идем в документацию: pandas.read_csv? (или pandas.DataFrame.to_csv, если хотите) и скроллим вниз
То есть можно на лету сжимать/разжимать csv файлы, и все что нужно - это всего лишь, чтобы файл имел правильное расширение (‘.gz’,
‘.bz2’, ‘.zip’ или ‘.xz’). Даже включать никакой флаг не нужно, это дефолтное поведение.
Пробуем!
Да, на сжатие ушло какое-то время. Смотрим результат:
Вау! Сжатие в 7.5 раз ! Сколько траффика, времени на скачивание/выкачивание, нервов и дискового пространства можно сэкономить!
Разумеется, открывается так же просто, как и сохраняется:
А как же время открытия?
Должен же быть подвох! Может, надо ждать полчаса на каждое открытие? Давайте проверим:
Ждать полчаса не придется:)
Кажется, нужно просто всегда дописывать .xz к названиям csv файлов, и все будет сразу хорошо. Это лучшая практика.