Когда данные летят между воркерами через multiprocessing или распределенные очереди, каждый байт копирования бьет по памяти. Стандартный pickle копирует объекты целиком, но переопределение
__getstate__ / __setstate__ с protocol 5 позволяет избежать лишних копий.Zero-copy через out-of-band буферы
В protocol 5 (Python 3.8+) появляется zero-copy передача через out-of-band буферы. Данные не упаковываются в байтовый поток, а передаются отдельно через shared memory или IPC.
__getstate__ возвращает только словарь метаданных, а __setstate__ восстанавливает объект из буфера.Пример с NumPy
import pickle
import numpy as np
class ZeroCopyArray:
def __init__(self, data):
self.data = data
def __getstate__(self):
return {'shape': self.data.shape, 'dtype': self.data.dtype}
def __setstate__(self, state):
self.shape, self.dtype, self.data = state['shape'], state['dtype'], None
При дампе с protocol=5 данные физически не копируются, а
None в сериализованном виде — expected.Где это критично
По умолчанию pickle копирует большие массивы при передаче через Redis, RabbitMQ или multiprocessing.Queue. Два процесса — два полных копирования. Protocol 5 позволяет не копировать, если оба процесса на одной машине.
* data pipelines с NumPy/Pandas, где каждый гигабайт на счету
* дублирование конфигов с тяжелыми данными — сериализуем только параметры
* потоковый парсинг бинарных протоколов
Типичная ошибка и предупреждение
Ошибка: думать, что zero-copy работает везде. Protocol 5 не поддерживается старым Celery с kombu, а out-of-band буферы требуют ручной передачи — они не входят в байтовый поток. На разных машинах zero-copy превращается в обычную копию из-за отсутствия shared memory.
Практический совет
Всегда ставьте
protocol=pickle.HIGHEST_PROTOCOL. Для критичных сценариев используйте 5-й протокол с правильными __getstate__ / __setstate__. Изучите PEP 574, документацию pickle.Pickler и код dask с cloudpickle — это реальные production-источники.Вывод: Protocol 5 с кастомными методами сериализации дает zero-copy передачу данных между воркерами на одной машине, экономя память и время, но требует контроля совместимости и ручной передачи буферов.