[devel] I: repocop test for %{get_version ...} is disabled.

Alexey Tourbin at на altlinux.ru
Чт Авг 23 03:24:43 MSK 2012


On Thu, Aug 23, 2012 at 01:29:44AM +0400, Alexey Tourbin wrote:
> Гарантию можно поднять: удвоение гарантии стоит 1 бит, в "base62"
> кодировке каждый символ несет 5.9+ битов.

Несколько точнее, при текущей гарантии 2^{-10} каждый символ из Provides
версии требует примерно 12 битов, т.е. примерно 2 буквы.  Следовательно,
чтобы поднять гарантию, например, в 64 раза, потребуется, еще примерно
log2(64)=6 битов на символ, то есть примерно еще 1 буква, то есть размер
Provides set-версий вырастет примерно в полтора раза.

Откуда берётся 12 битов?  Это этнорпия "n choose k" - выбор, грубо говоря,
2^{10} элементов из 2^{20} элементов.  Более точное значение равно 11.44
(но мы округляем количество символов в большую сторону, следовательно еще
полбита), и оно хорошо сохраняется при смене параметров:

$ R
> lchoose(2**20, 2**10)/log(2)/2**10
[1] 11.43581
> lchoose(2**30, 2**20)/log(2)/2**20
[1] 11.44198

(Довольно интересно, для представления набора 1024 20-битных чисел
требуется всего 11.44 бита на число - неплохое сжатие.)

Текущий размер всех set-версий (в буквенном виде) - примерно 13M, в сжатом
виде - примерно 9M:

$ strings /var/lib/apt/lists/_ALT_Sisyphus_x86%5f64_base_pkglist.classic |grep ^set: |wc -c
13820628
$ strings /var/lib/apt/lists/_ALT_Sisyphus_x86%5f64_base_pkglist.classic |grep ^set: |lzma |wc -c
9453115

Соответственно, чтобы поднять гарантию в 64 раза (весьма впечатлительно),
придется при каждом обновлении всё же скачивать лишние 5M и после разжатия
обрабатывать на клиенте лишние 7M (что тоже не совсем мало).

Следует отметить, что новые биты не сжимаются (по принципу энтропии "n
choose k"), то есть удвоение гарантии неизбежно требует полный новый бит,
а сжатие было возможно только на более "ранних" стадиях.

> lchoose(2**21, 2**10)/log(2)/2**10
[1] 12.43617
> lchoose(2**31, 2**20)/log(2)/2**20
[1] 12.44233

Следует также отметить, что Provides set-версии откусывают большую
половину, хотя и не подавляющую часть, в сравнении с Requires set-версиями.

$ pkglist-query '[%{ProvideVersion}\n]' /var/lib/apt/lists/_ALT_Sisyphus_x86%5f64_base_pkglist.classic |grep ^set: |wc -c
8261756
$ pkglist-query '[%{RequireVersion}\n]' /var/lib/apt/lists/_ALT_Sisyphus_x86%5f64_base_pkglist.classic |grep ^set: |wc -c
5558872


Подробная информация о списке рассылки Devel