summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Rousskov <mark.simulacrum@gmail.com>2023-02-27 10:48:42 -0500
committerGitHub <noreply@github.com>2023-02-27 10:48:42 -0500
commit31b4e313213dfaf62b2dd13a4da8176990929526 (patch)
treed15598ea21c223268e6b6104c4d22311933a4385
parent9981e4d1ea6ac0992ff21be5514d4230dc77548b (diff)
parentf1af54779ec7f111f5b804ae5683d30f6e1cb7fe (diff)
downloadrust-installer-31b4e313213dfaf62b2dd13a4da8176990929526.tar.gz
Merge pull request #123 from Mark-Simulacrum/compressionHEADmaster
Adjust xz compression settings
-rw-r--r--src/compression.rs50
1 files changed, 38 insertions, 12 deletions
diff --git a/src/compression.rs b/src/compression.rs
index 7e20a94..9b17698 100644
--- a/src/compression.rs
+++ b/src/compression.rs
@@ -39,14 +39,37 @@ impl CompressionFormat {
Ok(match self {
CompressionFormat::Gz => Box::new(GzEncoder::new(file, flate2::Compression::best())),
CompressionFormat::Xz => {
- // Note that preset 6 takes about 173MB of memory per thread, so we limit the number of
- // threads to not blow out 32-bit hosts. (We could be more precise with
- // `MtStreamBuilder::memusage()` if desired.)
- let stream = xz2::stream::MtStreamBuilder::new()
- .threads(Ord::min(num_cpus::get(), 8) as u32)
- .preset(6)
- .encoder()?;
- Box::new(XzEncoder::new_stream(file, stream))
+ let mut filters = xz2::stream::Filters::new();
+ // the preset is overridden by the other options so it doesn't matter
+ let mut lzma_ops = xz2::stream::LzmaOptions::new_preset(9).unwrap();
+ // This sets the overall dictionary size, which is also how much memory (baseline)
+ // is needed for decompression.
+ lzma_ops.dict_size(64 * 1024 * 1024);
+ // Use the best match finder for compression ratio.
+ lzma_ops.match_finder(xz2::stream::MatchFinder::BinaryTree4);
+ lzma_ops.mode(xz2::stream::Mode::Normal);
+ // Set nice len to the maximum for best compression ratio
+ lzma_ops.nice_len(273);
+ // Set depth to a reasonable value, 0 means auto, 1000 is somwhat high but gives
+ // good results.
+ lzma_ops.depth(1000);
+ // 2 is the default and does well for most files
+ lzma_ops.position_bits(2);
+ // 0 is the default and does well for most files
+ lzma_ops.literal_position_bits(0);
+ // 3 is the default and does well for most files
+ lzma_ops.literal_context_bits(3);
+
+ filters.lzma2(&lzma_ops);
+ let compressor = XzEncoder::new_stream(
+ std::io::BufWriter::new(file),
+ xz2::stream::MtStreamBuilder::new()
+ .threads(1)
+ .filters(filters)
+ .encoder()
+ .unwrap(),
+ );
+ Box::new(compressor)
}
})
}
@@ -94,10 +117,13 @@ impl fmt::Display for CompressionFormats {
if i != 0 {
write!(f, ",")?;
}
- fmt::Display::fmt(match format {
- CompressionFormat::Xz => "xz",
- CompressionFormat::Gz => "gz",
- }, f)?;
+ fmt::Display::fmt(
+ match format {
+ CompressionFormat::Xz => "xz",
+ CompressionFormat::Gz => "gz",
+ },
+ f,
+ )?;
}
Ok(())
}