Further improve LZMA compression parameters to utilize all the 14 levels.

Tweak some Rabin parmeters for better reduction with zlib and Bzip2.
This commit is contained in:
Moinak Ghosh 2012-07-30 23:30:13 +05:30
parent 7ff2cb74c4
commit 203008def9
2 changed files with 22 additions and 5 deletions

View file

@ -64,26 +64,38 @@ lzma_init(void **data, int *level, ssize_t chunksize)
* compression. * compression.
*/ */
p->dictSize = LZMA_DEFAULT_DICT; p->dictSize = LZMA_DEFAULT_DICT;
} else { } else {
/* /*
* Let LZMA determine best dict size. * Let LZMA determine best dict size.
*/ */
p->dictSize = 0; p->dictSize = 0;
} }
/* Determine the fast bytes value. */
/* Determine the fast bytes value and also adjust dict size further. */
if (*level < 7) { if (*level < 7) {
p->fb = 32; p->fb = 32;
} else if (*level < 10) { } else if (*level < 10) {
p->fb = 64; p->fb = 64;
} else if (*level < 13) { } else if (*level == 11) {
p->fb = 64; p->fb = 64;
p->mc = 128; p->mc = 128;
} else { } else if (*level == 12) {
p->fb = 128; p->fb = 128;
p->mc = 256; p->mc = 256;
} else if (*level == 13) {
p->fb = 64;
p->mc = 128;
p->dictSize = (1 << 27);
} else if (*level == 14) {
p->fb = 128;
p->mc = 256;
p->dictSize = (1 << 28);
} }
if (*level > 9) *level = 9; if (*level > 9) *level = 9;
p->level = *level; p->level = *level;

View file

@ -120,7 +120,8 @@ create_rabin_context(uint64_t chunksize, uint64_t real_chunksize, const char *al
if (((memcmp(algo, "lzma", 4) == 0 || memcmp(algo, "adapt", 5) == 0) && if (((memcmp(algo, "lzma", 4) == 0 || memcmp(algo, "adapt", 5) == 0) &&
chunksize <= LZMA_WINDOW_MAX) || delta_flag) { chunksize <= LZMA_WINDOW_MAX) || delta_flag) {
if (memcmp(algo, "lzfx", 4) == 0 || memcmp(algo, "lz4", 3) == 0) { if (memcmp(algo, "lzfx", 4) == 0 || memcmp(algo, "lz4", 3) == 0 ||
memcmp(algo, "zlib", 4) == 0) {
ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE2; ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE2;
ctx->rabin_avg_block_mask = RAB_POLYNOMIAL_AVG_BLOCK_MASK2; ctx->rabin_avg_block_mask = RAB_POLYNOMIAL_AVG_BLOCK_MASK2;
ctx->rabin_poly_avg_block_size = RAB_POLYNOMIAL_AVG_BLOCK_SIZE2; ctx->rabin_poly_avg_block_size = RAB_POLYNOMIAL_AVG_BLOCK_SIZE2;
@ -129,7 +130,11 @@ create_rabin_context(uint64_t chunksize, uint64_t real_chunksize, const char *al
ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE; ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE;
ctx->rabin_avg_block_mask = RAB_POLYNOMIAL_AVG_BLOCK_MASK; ctx->rabin_avg_block_mask = RAB_POLYNOMIAL_AVG_BLOCK_MASK;
ctx->rabin_poly_avg_block_size = RAB_POLYNOMIAL_AVG_BLOCK_SIZE; ctx->rabin_poly_avg_block_size = RAB_POLYNOMIAL_AVG_BLOCK_SIZE;
ctx->rabin_break_patt = RAB_POLYNOMIAL_CONST; if (memcmp(algo, "bzip2", 5) == 0) {
ctx->rabin_break_patt = 0;
} else {
ctx->rabin_break_patt = RAB_POLYNOMIAL_CONST;
}
} }
} else { } else {
ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE2; ctx->rabin_poly_min_block_size = RAB_POLYNOMIAL_MIN_BLOCK_SIZE2;