Размер сжатых файлов на диске значительно увеличивается после сортировки?

#pandas #compression #parquet

Вопрос:

У меня есть фрейм данных pandas, который я храню на диске в виде GZIP. В оперативной памяти его около 90 ГБ, и когда я сохранил его в формате gzip с помощью pandas.to_parquet, он сжимается примерно до 3 ГБ.

Недавно я отсортировал его с помощью pandas.sort_values в другом столбце, и внезапно этот размер на диске, когда я сохраняю его тем же методом, составляет 60 ГБ.

Почему это происходит и существует ли другой метод сортировки / сохранения, чтобы предотвратить это?

Комментарии:

1. gzip ищет повторения строк в окне размером 32 КБ. Если ваши повторяющиеся строки находятся слишком далеко друг от друга, они не будут распознаны и поэтому не будут хорошо сжиматься. Вы можете попробовать brotli метод, который должен иметь возможность использовать окно размером до 16 МБ, хотя я понятия не имею, какие параметры использует pandas.

Ответ №1:

Я должен был бы предположить, что ваш файл ранее был отсортирован по другому столбцу, и что совпадение содержимого этого столбца с непосредственно предшествующими записями было важной частью сжатия. Затем, когда вы сортировали по другому столбцу, этот другой столбец был эффективно рандомизирован, чтобы похожие значения больше не находились рядом друг с другом. Столбец, который вы отсортировали, скорее всего, будет иметь лучшее сжатие, чем раньше, но этот эффект невелик по сравнению с первоначально отсортированным столбцом. Вот что убило сжатие.

Комментарии:

1. хотя это все еще сводит меня с ума. Почему дешевле хранить местоположение аналогичных значений, чем просто хранить само значение?

2. Не похожие значения, но похожие строки . Если строка достаточно длинная, ссылка на предыдущее вхождение той же строки (длина и расстояние) займет меньше битов, чем сама строка. Это может быть верно для строк длиной до трех.