[pacman-dev] [PATCH] pkgdelta: use highest compression ratio when creating deltas with xdelta3

Matthias Krüger matthias.krueger at famsik.de
Wed Mar 5 19:14:04 EST 2014

On 03/06/2014 12:33 AM, Allan McRae wrote:
> On 06/03/14 09:25, Matthias Krüger wrote:
>> Looking how pkgdelta works, I found this line
>>      xdelta3  -q -f -s "$oldfile" "$newfile" "$deltafile" || ret=$?
>> which seemed to be responsible for the actual delta generation, however
>>      man xdelta3
>> revealed that there were different compression levels (0-9) (not sure
>> which one is default).
>> To make it short, we could have had smaller deltas since pkgdelta was
>> introduced!
>> Examples:
>> -9          16660K
>> blender-12:2.69.c7ac0e-1_to_13:2.69.13290d-1-x86_64.delta
>>   default  17832K blender-12:2.69.c7ac0e-1_to_13:2.69.13290d-1-x86_64.delta
>> -9         504K    xbmc-12.3-10_to_12.3-11-x86_64.delta
>> default  572K   xbmc-12.3-10_to_12.3-11-x86_64.delta
> How is memory usage changed?   Mainly when regenerating the package from
> deltas?
Surprisingly, for blender both runs took ~96MB and 1:50m (+- a second).
>> The attached patch adds the "-9" option to the line above.
>> Side note: it might be even more advantageous to use bsdiff instead of
>> xdelta3
>> comparing the /usr/bin/blender binaries of the above versions
>> (12:2.69.c7ac0e-1 and 13:2.69.13290d-1) :
>> xdelta3     10.4M
>> xdelta3 -9   9.9M
>> bsdiff          4.7M
>> ,however bsdiff is only for direct diff creation, bsdiff foo1.pkg.tar.xz
>> foo2.pkg.tar.xz will create a diff between the archives and not their
>> contents, so that'd require further coding which I am unable to do
>> (maybe someone else volunteers :) ).
> What do you mean "create a diff between the archives and not their
> contents".   That does seem a significant decrease.
To my understanding xdelta opens the archive and diffs the files 
contained in it while bsdiff will just generate a diff between the 
archives. At least it would fit the observations:

xdelta ${args} blender-12:2.69.c7ac0e-1-x86_64.pkg.tar.xz 
blender-13:2.69.13290d-1-x86_64.pkg.tar.xz out
=> 17 M
bsdiff blender-12:2.69.c7ac0e-1-x86_64.pkg.tar.xz 
blender-13:2.69.13290d-1-x86_64.pkg.tar.xz out
=> 37 M
(while creating this diff, bsdiff ate up to ~660M ram :/)

 From man bsdiff:

bsdiff uses memory equal to 17 times the size of ⟨oldfile⟩, and requires 
an absolute minimum working set size of 8 times the
size of oldfile.

Regards, Matthias

More information about the pacman-dev mailing list