Команда uv представила pull request с пофайловой дедупликацией wheel-кэша. Материал объясняет, как хранить каждый файл по BLAKE3-хэшу в отдельном бакете.

Сейчас content-addressed caching работает только на уровне wheel, поэтому файлы внутри одного или разных wheel не дедуплицируются. Предложенная схема хранит файлы в бакете files-v0 и помещает их жёсткими ссылками в archive-v0, не меняя этап установки.

На локальной машине автора дедупликация сэкономила 545,2 MiB, или около 10% кэша. По сводной оценке, холодные установки замедлились менее чем на 4%, а скорость тёплых установок не изменилась.

Бенчмарки проводились на Linux с ext4 и не охватывали другие платформы или установки с сетевой загрузкой. Изменение помечено как экспериментальное с помощью метки preview.

Проверка утверждений:

  • Команда uv представила материал типа release в форме pull request: документ предлагает пофайловую дедупликацию wheel-кэша и объясняет читателю, что каждый файл будет храниться по BLAKE3-хэшу в отдельном бакете. (подтверждено первоисточником: доказательство; «This PR adds deduplication at the file level: every file is now stored under its BLAKE3 hash in a files-v0 bucket.»)
  • На момент описания основная ветка uv поддерживала content-addressed caching только на уровне wheel: одинаковые wheel из разных источников делили запись кэша, но файлы внутри одного или разных wheel не дедуплицировались. (подтверждено первоисточником: доказательство; «On main, we support content-addressed caching, but only at the wheel-level. That is, if you download the same wheel twice from different sources, they share a cache entry. But files within or across wheels are not deduplicated at all.»)
  • В предлагаемой архитектуре каждый файл хранится по BLAKE3-хэшу в бакете files-v0, а объекты жёсткими ссылками помещаются в исходные позиции archive-v0, поэтому этап установки не меняется; очистка удаляет объект, когда число жёстких ссылок падает до одной. (подтверждено первоисточником: доказательство; «We hardlink these objects into their original locations in archive-v0 , so the installation step doesn’t change at all – we’re just deduping within the cache (and cache cleanup removes file objects when their hardlink count drops to one).»)
  • На локальной машине автора дедупликация всех payload-файлов сэкономила 545,2 MiB, то есть около 10% кэша. (подтверждено первоисточником: доказательство; «So we’re saving 545.2 MiB on my local machine, or about 10% of the cache.»)
  • По сводной оценке автора, холодные установки замедлялись менее чем на 4%, а на тёплые установки изменение не влияло. (подтверждено первоисточником: доказательство; «In return, the net effect seems to be something like a <4% slowdown for cold installs (and no effect on warm installs), which I think is probably worthwhile here.»)
  • Во всех восьми медианных результатах регрессия была ниже 5%, но верхняя граница 95%-го интервала для холодной установки PyTorch достигала 5,18%; у остальных результатов верхняя граница оставалась ниже 5%. (подтверждено первоисточником: доказательство; «All eight median regressions are below 5%. The PyTorch cold 95% interval still reaches 5.18%, so its upper bound is not below 5%. Every other upper bound is below 5%.»)
  • В замеры вошли все 1 860 установок, включая выбросы; холодные тесты получили 360 парных раундов для AnyIO, по 120 для SymPy и NumPy и 90 для PyTorch, тёплые — по 60, а интервалы считались парным percentile bootstrap отношения медиан с 10 000 повторных выборок. (подтверждено первоисточником: доказательство; «We retained all 1,860 measured installs, including outliers, and combined every confirmation run for this candidate. Cold measurements have 360 paired rounds for AnyIO, 120 each for SymPy and NumPy, and 90 for PyTorch; warm measurements have 60 paired rounds per wheel. Baseline/candidate order alternates, with three warmups per case. Intervals use a paired percentile bootstrap of the ratio of medians with 10,000 resamples.»)
  • Бенчмарки проводились на Linux/ext4, VM с AMD EPYC Milan и восемью закреплёнными CPU, Python 3.12.13 и Rust 1.98.0; они не охватывают другие платформы и установки с сетевой загрузкой. (подтверждено первоисточником: доказательство; «These measurements ran on Linux/ext4, an AMD EPYC-Milan VM pinned to eight CPUs, with Python 3.12.13. Both binaries use Rust 1.98.0 and the same profiling profile (optimized, no LTO). Each sample installs one pinned local wheel offline, without dependencies or bytecode compilation, using hardlinks into a fresh virtual environment. Cold removes the entire uv cache; warm retains a primed cache. Setup and cleanup are untimed, and the wheel OS page cache is warm. No compilation ran during the benchmarks. These results do not cover other platforms or network-inclusive installs.»)
  • Проверка inode подтвердила разделение файлов с объектами file-store для всех четырёх wheel; пять целевых интеграционных тестов прошли десять стресс-прогонов, всего 50 выполнений, включая локальные и потоковые wheel, один и четыре worker, обработку RECORD, очистку кэша и установку между файловыми системами. (подтверждено первоисточником: доказательство; «All-file deduplication, content/executable identities, the cache layout, complete archives, and copy fallbacks are preserved. Inode checks confirmed that every archived file shares its file-store object for all four wheels. The five targeted integration tests passed ten stress iterations (50 executions), including local and streamed wheels with one and four workers, RECORD handling, cache cleanup, and cross-filesystem installation. Formatting and Clippy with warnings denied also passed.»)
  • Изменение помечено меткой preview как экспериментальное поведение. (подтверждено первоисточником: доказательство; «preview Experimental behavior»)

Первоисточники:

оценка 58.0 · тип release · ревизия 1 · истории st-1xthlgi