Прямой ответ
Сжатие сокращает объём хранения и передачи, но добавляет время на распаковку при каждом чтении. Выбор определяется тем, что ограничивает: объём либо время доступа.
| Критерий | Без сжатия | Со сжатием |
|---|---|---|
| Объём хранения | Исходный | Сокращён в несколько раз |
| Время чтения | Только ввод-вывод | Ввод-вывод + распаковка |
| Потребление процессора | Низкое | Заметное |
| Объём передачи | Исходный | Сокращён |
import time, zstandard as zstd
raw = open("data.bin", "rb").read()
cctx = zstd.ZstdCompressor(level=9)
compressed = cctx.compress(raw)
t0 = time.perf_counter()
dctx = zstd.ZstdDecompressor()
out = dctx.decompress(compressed)
t1 = time.perf_counter()
print(f"коэффициент {len(raw)/len(compressed):.2f}, распаковка {t1-t0:.4f} с")
Распаковка выполняется быстрее сжатия, поэтому асимметрия учитывается при выборе: данные с частым чтением сжимаются алгоритмом с быстрой распаковкой; о выборе алгоритма — в статье про алгоритмы сжатия.
Характер обращений и точка равновесия
Соотношение выгоды от сжатия определяется частотой и характером обращений к данным.
Данные записываются один раз, читаются редко. Сжатие выгодно, поскольку экономия объёма накоплена за всё время хранения, а стоимость распаковки оплачивается редко.
Данные читаются часто. Распаковка выполняется при каждом обращении, поэтому стоимость распаковки накоплена и может превысить экономию объёма.
Данные передаются по сети. Сжатие сокращает объём передачи, поэтому выигрыш определяется соотношением времени распаковки и времени передачи сокращённого объёма.
Практическое следствие: точка равновесия определяется измерением на фактических данных и нагрузке; о методике — в статье про оценку коэффициента.
Отдельный аспект — потребление процессора. Распаковка расходует вычислительный ресурс, поэтому при высокой нагрузке доля процессора, занятая распаковкой, становится заметной. Оценка нагрузки выполняется по методике из статьи про capacity planning.
Три признака в пользу отказа от сжатия.
Данные уже сжаты. Повторное сжатие расходует время без уменьшения объёма.
Частое чтение малых частей. Распаковка выполняется целиком, поэтому обращение к малой части значения требует распаковки всего объёма.
Ограниченный процессорный ресурс. Доля процессора, занятая распаковкой, снижает пропускную способность обработки запросов.
Влияние на ввод-вывод и кэш
Сжатие изменяет соотношение между объёмом ввода-вывода и вычислениями, что влияет на общую производительность.
Объём ввода-вывода. Сжатые данные занимают меньше места на диске, поэтому чтение требует меньшего объёма ввода-вывода. При медленном диске выигрыш может превысить стоимость распаковки.
Кэш операционной системы. Сжатые данные занимают меньше места в кэше, поэтому в том же объёме кэша помещается больше данных. Это сокращает число обращений к диску.
Потребление памяти при распаковке. Распакованное значение занимает исходный объём, поэтому при работе с большими значениями требуется память на распакованный результат.
Практическое следствие: при медленном диске сжатие может ускорить чтение, поскольку сокращение объёма ввода-вывода превышает стоимость распаковки. При быстром диске соотношение обратное.
Распространённая схема — сжатие с разной интенсивностью для данных с разной частотой чтения: активные данные хранятся без сжатия либо с быстрым алгоритмом, архивные — с высоким коэффициентом.
Влияние на передачу данных по сети
При передаче данных по сети сжатие сокращает объём, поэтому соотношение определяется пропускной способностью канала и стоимостью распаковки.
Медленный канал. Сокращение объёма передачи даёт заметный выигрыш, поскольку время передачи доминирует над временем распаковки. Сжатие применяется даже к данным с умеренным коэффициентом.
Быстрый канал. Время передачи мало, поэтому стоимость распаковки становится заметной долей общего времени. Сжатие применяется только к данным с высоким коэффициентом.
Ограничение по объёму передачи. При тарификации по объёму сжатие сокращает расходы независимо от скорости канала, поэтому применяется к данным с любой частотой обращений.
Практическое следствие: решение о сжатии при передаче определяется соотношением времени передачи сокращённого объёма и времени распаковки.
Отдельный аспект — сжатие на стороне отправителя и получателя. Сжатие выполняется один раз, поэтому повторное сжатие в промежуточном узле не даёт выигрыша, но расходует ресурс.
Практика: выбор между сжатием и скоростью доступа
1. Определите частоту обращений. Данные с редким чтением сжимаются с высоким коэффициентом, с частым — быстрым алгоритмом либо не сжимаются.
2. Измерьте время распаковки. Распаковка выполняется при каждом чтении, поэтому её стоимость накоплена.
3. Учтите скорость диска. При медленном диске сокращение объёма ввода-вывода может превысить стоимость распаковки.
4. Оцените потребление процессора. Доля ресурса, занятая распаковкой, снижает пропускную способность обработки запросов.
5. Не сжимайте уже сжатые данные. Повторное сжатие расходует время без уменьшения объёма.
6. Различайте данные по частоте чтения. Активные и архивные данные сжимаются с разной интенсивностью.
7. Повторяйте измерение при изменении нагрузки. Изменение частоты обращений меняет соотношение выгоды.
Рекомендации:
- Различайте экономию объёма и стоимость распаковки. Экономия накоплена за время хранения, стоимость распаковки — за число обращений.
- Учитывайте асимметрию сжатия и распаковки. Распаковка быстрее сжатия, поэтому данные с частым чтением требуют быстрой распаковки.
- Проверяйте поведение на малых значениях. Заголовок алгоритма занимает фиксированный объём, поэтому на малых данных выигрыш отсутствует.
- Фиксируйте решение по типу данных. Разные типы данных имеют разную частоту обращений, поэтому решение принимается по каждому.
- Пересматривайте при изменении характера нагрузки. Рост частоты обращений делает сжатие менее выгодным.
Практический сценарий: сжатие замедлило чтение активных данных
Контекст: время чтения данных выросло после включения сжатия с высоким коэффициентом.
- Диагностика. Данные читались часто, распаковка выполнялась при каждом обращении. Сокращение объёма ввода-вывода не компенсировало время распаковки, поскольку диск был быстрым.
- Причина. Решение о сжатии принято по экономии объёма без учёта частоты обращений и скорости диска. Стоимость распаковки накоплена пропорционально числу чтений.
- Действия. (а) Измерили время чтения со сжатием и без него на фактической нагрузке; (б) разделили данные по частоте обращений: активные оставили без сжатия, архивные сжали с высоким коэффициентом; (в) для данных со средней частотой выбрали алгоритм с быстрой распаковкой; (г) оценили долю процессора, занятую распаковкой, и убедились в приемлемости; (д) зафиксировали правило выбора по частоте обращений.
- Результат. Время чтения активных данных вернулось к прежнему, а объём хранения архивных данных сократился.
Вывод: сжатие выгодно при редком чтении и медленном диске, поскольку экономия объёма накоплена. При частом чтении стоимость распаковки превышает экономию, поэтому решение принимается по частоте обращений.
FAQ
Когда сжатие ускоряет чтение? При медленном диске, когда сокращение объёма ввода-вывода превышает стоимость распаковки. Также при ограниченном объёме кэша, поскольку сжатые данные занимают меньше места.
Когда от сжатия лучше отказаться? При частом чтении малых частей значений, при уже сжатых данных и при ограниченном процессорном ресурсе.
Влияет ли уровень сжатия на скорость распаковки? Незначительно. Скорость распаковки мало зависит от уровня, поэтому данные с высоким уровнем читаются почти так же быстро.
Как принять решение при смешанной нагрузке? Разделить данные по частоте обращений и применить разную интенсивность сжатия к активным и архивным данным.
Источники: Zstandard, LZ4, gzip — ссылки в шапке.