omnizip 0.4.7-arm-linux
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/.rubocop.yml +32 -0
- data/.rubocop_todo.yml +293 -0
- data/CHANGELOG.md +1647 -0
- data/CONTEXT.md +68 -0
- data/COPYING +502 -0
- data/Gemfile +19 -0
- data/LICENSE +12 -0
- data/README.adoc +1327 -0
- data/Rakefile +15 -0
- data/TODO.refactor/00-overview.md +67 -0
- data/TODO.refactor/01-registry-base-class.md +81 -0
- data/TODO.refactor/02-error-hierarchy.md +57 -0
- data/TODO.refactor/03-autoload-entry-point.md +69 -0
- data/TODO.refactor/04-filter-base-consolidation.md +49 -0
- data/TODO.refactor/05-send-private-methods.md +64 -0
- data/TODO.refactor/06-instance-variable-access.md +69 -0
- data/TODO.refactor/07-respond-to-replacement.md +237 -0
- data/TODO.refactor/08-spec-doubles.md +27 -0
- data/TODO.refactor/09-cli-shared-module.md +35 -0
- data/TODO.refactor/10-format-detector-ocp.md +34 -0
- data/TODO.refactor/11-convenience-decoupling.md +38 -0
- data/TODO.refactor/12-thread-safety.md +8 -0
- data/TODO.refactor/13-lutaml-model-migration.md +158 -0
- data/TODO.refactor/14-add-missing-specs.md +25 -0
- data/benchmark/README.md +260 -0
- data/benchmark/benchmark_suite.rb +125 -0
- data/benchmark/compression_bench.rb +181 -0
- data/benchmark/filter_bench.rb +180 -0
- data/benchmark/models/benchmark_result.rb +59 -0
- data/benchmark/models/comparison_result.rb +69 -0
- data/benchmark/profile_suite.rb +167 -0
- data/benchmark/reporter.rb +150 -0
- data/benchmark/run_benchmarks.rb +66 -0
- data/benchmark/test_data.rb +137 -0
- data/config/formats/rar3_spec.yml +92 -0
- data/config/formats/rar5_spec.yml +102 -0
- data/docs/.github/workflows/docs.yml +142 -0
- data/docs/.gitignore +21 -0
- data/docs/.lychee.toml +67 -0
- data/docs/Gemfile +13 -0
- data/docs/RAR_WRITE_SUPPORT.md +26 -0
- data/docs/README.md +101 -0
- data/docs/_config.yml +112 -0
- data/docs/assets/logo.svg +1 -0
- data/docs/assets/omnizip-logo.pdf +1540 -11
- data/docs/comparison/feature-matrix.adoc +694 -0
- data/docs/comparison/index.adoc +113 -0
- data/docs/comparison/vs-7zip.adoc +309 -0
- data/docs/comparison/vs-peazip.adoc +77 -0
- data/docs/comparison/vs-rubyzip.adoc +342 -0
- data/docs/comparison/vs-winrar.adoc +100 -0
- data/docs/compatibility.adoc +579 -0
- data/docs/concepts/index.adoc +129 -0
- data/docs/developer/architecture.adoc +256 -0
- data/docs/developer/contributing.adoc +158 -0
- data/docs/developer/index.adoc +25 -0
- data/docs/developer/testing.adoc +212 -0
- data/docs/getting-started/basic-usage.adoc +263 -0
- data/docs/getting-started/index.adoc +42 -0
- data/docs/getting-started/installation.adoc +138 -0
- data/docs/getting-started/quick-start.adoc +183 -0
- data/docs/getting-started/your-first-archive.adoc +219 -0
- data/docs/guides/advanced-features/encryption.adoc +277 -0
- data/docs/guides/advanced-features/index.adoc +59 -0
- data/docs/guides/advanced-features/parallel-processing.adoc +144 -0
- data/docs/guides/advanced-features/progress-tracking.adoc +124 -0
- data/docs/guides/advanced-features/streaming.adoc +142 -0
- data/docs/guides/archive-formats/gzip-format.adoc +105 -0
- data/docs/guides/archive-formats/index.adoc +160 -0
- data/docs/guides/archive-formats/ole-format.adoc +151 -0
- data/docs/guides/archive-formats/rar-format.adoc +104 -0
- data/docs/guides/archive-formats/rar5.adoc +521 -0
- data/docs/guides/archive-formats/rpm-format.adoc +108 -0
- data/docs/guides/archive-formats/seven-zip-format.adoc +35 -0
- data/docs/guides/archive-formats/tar-format.adoc +106 -0
- data/docs/guides/archive-formats/xz-format.adoc +118 -0
- data/docs/guides/archive-formats/zip-format.adoc +35 -0
- data/docs/guides/compression-algorithms/bzip2.adoc +114 -0
- data/docs/guides/compression-algorithms/deflate.adoc +313 -0
- data/docs/guides/compression-algorithms/index.adoc +190 -0
- data/docs/guides/compression-algorithms/lzma.adoc +394 -0
- data/docs/guides/compression-algorithms/lzma2.adoc +244 -0
- data/docs/guides/compression-algorithms/ppmd.adoc +313 -0
- data/docs/guides/compression-algorithms/zstandard.adoc +296 -0
- data/docs/guides/creating-archives.adoc +348 -0
- data/docs/guides/extracting-archives.adoc +53 -0
- data/docs/guides/format-conversion.adoc +64 -0
- data/docs/guides/index.adoc +49 -0
- data/docs/guides/migration-rubyzip.adoc +217 -0
- data/docs/guides/parity-archives.adoc +605 -0
- data/docs/guides/performance-tuning.adoc +88 -0
- data/docs/index.adoc +228 -0
- data/docs/lychee.toml +67 -0
- data/docs/reference/api/overview.adoc +187 -0
- data/docs/reference/cli/compress-command.adoc +114 -0
- data/docs/reference/cli/overview.adoc +140 -0
- data/docs/reference/index.adoc +26 -0
- data/docs/resources/faq.adoc +185 -0
- data/docs/resources/quick-reference.adoc +222 -0
- data/docs/rust-backend.md +0 -0
- data/docs/troubleshooting/index.adoc +207 -0
- data/docs/xar_format.md +216 -0
- data/examples/api_comparison.rb +205 -0
- data/examples/deflate64_example.rb +96 -0
- data/examples/par2_demo.rb +121 -0
- data/examples/quick_start_native.rb +150 -0
- data/examples/quick_start_rubyzip.rb +115 -0
- data/examples/rubyzip_compatibility_demo.rb +194 -0
- data/exe/omnizip +27 -0
- data/lib/omnizip/algorithm.rb +176 -0
- data/lib/omnizip/algorithm_registry.rb +65 -0
- data/lib/omnizip/algorithms/.keep +0 -0
- data/lib/omnizip/algorithms/bzip2/bwt.rb +236 -0
- data/lib/omnizip/algorithms/bzip2/bz2.rb +687 -0
- data/lib/omnizip/algorithms/bzip2/rle.rb +146 -0
- data/lib/omnizip/algorithms/bzip2.rb +108 -0
- data/lib/omnizip/algorithms/deflate/constants.rb +28 -0
- data/lib/omnizip/algorithms/deflate/decoder.rb +37 -0
- data/lib/omnizip/algorithms/deflate/encoder.rb +45 -0
- data/lib/omnizip/algorithms/deflate.rb +135 -0
- data/lib/omnizip/algorithms/deflate64/constants.rb +45 -0
- data/lib/omnizip/algorithms/deflate64/decoder.rb +151 -0
- data/lib/omnizip/algorithms/deflate64/encoder.rb +95 -0
- data/lib/omnizip/algorithms/deflate64/huffman_coder.rb +352 -0
- data/lib/omnizip/algorithms/deflate64/lz77_encoder.rb +140 -0
- data/lib/omnizip/algorithms/deflate64.rb +118 -0
- data/lib/omnizip/algorithms/lzma/bit_model.rb +120 -0
- data/lib/omnizip/algorithms/lzma/constants.rb +112 -0
- data/lib/omnizip/algorithms/lzma/decoder.rb +146 -0
- data/lib/omnizip/algorithms/lzma/dictionary.rb +70 -0
- data/lib/omnizip/algorithms/lzma/distance_coder.rb +326 -0
- data/lib/omnizip/algorithms/lzma/encoder.rb +139 -0
- data/lib/omnizip/algorithms/lzma/length_coder.rb +172 -0
- data/lib/omnizip/algorithms/lzma/literal_decoder.rb +204 -0
- data/lib/omnizip/algorithms/lzma/literal_encoder.rb +208 -0
- data/lib/omnizip/algorithms/lzma/lzip_decoder.rb +368 -0
- data/lib/omnizip/algorithms/lzma/lzma1_encoder.rb +105 -0
- data/lib/omnizip/algorithms/lzma/lzma_alone_decoder.rb +194 -0
- data/lib/omnizip/algorithms/lzma/lzma_state.rb +128 -0
- data/lib/omnizip/algorithms/lzma/match.rb +32 -0
- data/lib/omnizip/algorithms/lzma/match_finder.rb +233 -0
- data/lib/omnizip/algorithms/lzma/match_finder_config.rb +142 -0
- data/lib/omnizip/algorithms/lzma/match_finder_factory.rb +84 -0
- data/lib/omnizip/algorithms/lzma/optimal_encoder.rb +159 -0
- data/lib/omnizip/algorithms/lzma/probability_models.rb +72 -0
- data/lib/omnizip/algorithms/lzma/range_coder.rb +82 -0
- data/lib/omnizip/algorithms/lzma/range_decoder.rb +274 -0
- data/lib/omnizip/algorithms/lzma/range_encoder.rb +202 -0
- data/lib/omnizip/algorithms/lzma/state.rb +127 -0
- data/lib/omnizip/algorithms/lzma/xz_buffered_range_encoder.rb +323 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder.rb +420 -0
- data/lib/omnizip/algorithms/lzma/xz_encoder_fast.rb +640 -0
- data/lib/omnizip/algorithms/lzma/xz_match_finder_adapter.rb +224 -0
- data/lib/omnizip/algorithms/lzma/xz_price_calculator.rb +167 -0
- data/lib/omnizip/algorithms/lzma/xz_probability_models.rb +258 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder.rb +223 -0
- data/lib/omnizip/algorithms/lzma/xz_range_encoder_exact.rb +314 -0
- data/lib/omnizip/algorithms/lzma/xz_state.rb +108 -0
- data/lib/omnizip/algorithms/lzma/xz_utils_decoder.rb +1311 -0
- data/lib/omnizip/algorithms/lzma.rb +266 -0
- data/lib/omnizip/algorithms/lzma2/chunk_manager.rb +180 -0
- data/lib/omnizip/algorithms/lzma2/constants.rb +38 -0
- data/lib/omnizip/algorithms/lzma2/encoder.rb +145 -0
- data/lib/omnizip/algorithms/lzma2/lzma2_chunk.rb +165 -0
- data/lib/omnizip/algorithms/lzma2/properties.rb +179 -0
- data/lib/omnizip/algorithms/lzma2/simple_lzma2_encoder.rb +122 -0
- data/lib/omnizip/algorithms/lzma2/xz_encoder_adapter.rb +85 -0
- data/lib/omnizip/algorithms/lzma2.rb +133 -0
- data/lib/omnizip/algorithms/ppmd7/constants.rb +74 -0
- data/lib/omnizip/algorithms/ppmd7/context.rb +151 -0
- data/lib/omnizip/algorithms/ppmd7/decoder.rb +127 -0
- data/lib/omnizip/algorithms/ppmd7/encoder.rb +153 -0
- data/lib/omnizip/algorithms/ppmd7/model.rb +245 -0
- data/lib/omnizip/algorithms/ppmd7/symbol_state.rb +57 -0
- data/lib/omnizip/algorithms/ppmd7.rb +146 -0
- data/lib/omnizip/algorithms/ppmd8/constants.rb +61 -0
- data/lib/omnizip/algorithms/ppmd8/context.rb +32 -0
- data/lib/omnizip/algorithms/ppmd8/decoder.rb +104 -0
- data/lib/omnizip/algorithms/ppmd8/encoder.rb +135 -0
- data/lib/omnizip/algorithms/ppmd8/model.rb +246 -0
- data/lib/omnizip/algorithms/ppmd8/restoration_method.rb +78 -0
- data/lib/omnizip/algorithms/ppmd8.rb +122 -0
- data/lib/omnizip/algorithms/ppmd_base.rb +142 -0
- data/lib/omnizip/algorithms/registration.rb +28 -0
- data/lib/omnizip/algorithms/zstandard/constants.rb +158 -0
- data/lib/omnizip/algorithms/zstandard/decoder.rb +249 -0
- data/lib/omnizip/algorithms/zstandard/dictionary.rb +73 -0
- data/lib/omnizip/algorithms/zstandard/encoder.rb +294 -0
- data/lib/omnizip/algorithms/zstandard/frame/block.rb +143 -0
- data/lib/omnizip/algorithms/zstandard/frame/header.rb +233 -0
- data/lib/omnizip/algorithms/zstandard/frame.rb +33 -0
- data/lib/omnizip/algorithms/zstandard/fse/bitstream.rb +183 -0
- data/lib/omnizip/algorithms/zstandard/fse/encoder.rb +534 -0
- data/lib/omnizip/algorithms/zstandard/fse/interleaved.rb +92 -0
- data/lib/omnizip/algorithms/zstandard/fse/table.rb +188 -0
- data/lib/omnizip/algorithms/zstandard/fse/table_description.rb +203 -0
- data/lib/omnizip/algorithms/zstandard/fse.rb +53 -0
- data/lib/omnizip/algorithms/zstandard/huffman.rb +276 -0
- data/lib/omnizip/algorithms/zstandard/huffman_encoder.rb +327 -0
- data/lib/omnizip/algorithms/zstandard/ldm.rb +121 -0
- data/lib/omnizip/algorithms/zstandard/literals.rb +241 -0
- data/lib/omnizip/algorithms/zstandard/literals_encoder.rb +96 -0
- data/lib/omnizip/algorithms/zstandard/match_finder.rb +483 -0
- data/lib/omnizip/algorithms/zstandard/sequences.rb +350 -0
- data/lib/omnizip/algorithms/zstandard/sequences_encoder.rb +333 -0
- data/lib/omnizip/algorithms/zstandard/xxhash.rb +159 -0
- data/lib/omnizip/algorithms/zstandard.rb +210 -0
- data/lib/omnizip/algorithms.rb +35 -0
- data/lib/omnizip/archive/builder.rb +48 -0
- data/lib/omnizip/archive/reader_session.rb +67 -0
- data/lib/omnizip/archive.rb +86 -0
- data/lib/omnizip/archive_handler.rb +82 -0
- data/lib/omnizip/archive_handlers/cpio_handler.rb +47 -0
- data/lib/omnizip/archive_handlers/iso_handler.rb +54 -0
- data/lib/omnizip/archive_handlers/ole_handler.rb +37 -0
- data/lib/omnizip/archive_handlers/rar_handler.rb +96 -0
- data/lib/omnizip/archive_handlers/rpm_handler.rb +45 -0
- data/lib/omnizip/archive_handlers/seven_zip_handler.rb +89 -0
- data/lib/omnizip/archive_handlers/tar_handler.rb +75 -0
- data/lib/omnizip/archive_handlers/xar_handler.rb +49 -0
- data/lib/omnizip/archive_handlers/zip_handler.rb +115 -0
- data/lib/omnizip/archive_handlers.rb +18 -0
- data/lib/omnizip/backends.rb +160 -0
- data/lib/omnizip/buffer/memory_archive.rb +246 -0
- data/lib/omnizip/buffer/memory_extractor.rb +234 -0
- data/lib/omnizip/buffer/seven_zip_bridge.rb +171 -0
- data/lib/omnizip/buffer.rb +187 -0
- data/lib/omnizip/checksum_registry.rb +41 -0
- data/lib/omnizip/checksums/crc32.rb +101 -0
- data/lib/omnizip/checksums/crc64.rb +102 -0
- data/lib/omnizip/checksums/crc_base.rb +158 -0
- data/lib/omnizip/checksums/registration.rb +16 -0
- data/lib/omnizip/checksums/verifier.rb +130 -0
- data/lib/omnizip/checksums.rb +11 -0
- data/lib/omnizip/chunked/memory_manager.rb +194 -0
- data/lib/omnizip/chunked/reader.rb +78 -0
- data/lib/omnizip/chunked/writer.rb +123 -0
- data/lib/omnizip/chunked.rb +123 -0
- data/lib/omnizip/cli/output_formatter.rb +112 -0
- data/lib/omnizip/cli.rb +604 -0
- data/lib/omnizip/commands/.keep +0 -0
- data/lib/omnizip/commands/archive_create_command.rb +245 -0
- data/lib/omnizip/commands/archive_extract_command.rb +231 -0
- data/lib/omnizip/commands/archive_list_command.rb +204 -0
- data/lib/omnizip/commands/archive_repair_command.rb +129 -0
- data/lib/omnizip/commands/archive_verify_command.rb +115 -0
- data/lib/omnizip/commands/compress_command.rb +115 -0
- data/lib/omnizip/commands/decompress_command.rb +149 -0
- data/lib/omnizip/commands/list_command.rb +51 -0
- data/lib/omnizip/commands/metadata_command.rb +215 -0
- data/lib/omnizip/commands/parity_create_command.rb +114 -0
- data/lib/omnizip/commands/parity_repair_command.rb +120 -0
- data/lib/omnizip/commands/parity_verify_command.rb +122 -0
- data/lib/omnizip/commands/profile_list_command.rb +54 -0
- data/lib/omnizip/commands/profile_show_command.rb +44 -0
- data/lib/omnizip/commands.rb +21 -0
- data/lib/omnizip/convenience.rb +389 -0
- data/lib/omnizip/converter/conversion_registry.rb +50 -0
- data/lib/omnizip/converter/conversion_strategy.rb +108 -0
- data/lib/omnizip/converter/extract_repack_strategy.rb +51 -0
- data/lib/omnizip/converter/seven_zip_to_zip_strategy.rb +43 -0
- data/lib/omnizip/converter/zip_to_seven_zip_strategy.rb +54 -0
- data/lib/omnizip/converter.rb +124 -0
- data/lib/omnizip/crypto/aes256/cipher.rb +104 -0
- data/lib/omnizip/crypto/aes256/constants.rb +28 -0
- data/lib/omnizip/crypto/aes256/key_derivation.rb +100 -0
- data/lib/omnizip/crypto/aes256.rb +102 -0
- data/lib/omnizip/crypto.rb +11 -0
- data/lib/omnizip/entry.rb +44 -0
- data/lib/omnizip/error.rb +110 -0
- data/lib/omnizip/eta/exponential_smoothing_estimator.rb +95 -0
- data/lib/omnizip/eta/moving_average_estimator.rb +96 -0
- data/lib/omnizip/eta/rate_calculator.rb +104 -0
- data/lib/omnizip/eta/sample_history.rb +143 -0
- data/lib/omnizip/eta/time_estimator.rb +106 -0
- data/lib/omnizip/eta.rb +68 -0
- data/lib/omnizip/extraction/filter_chain.rb +179 -0
- data/lib/omnizip/extraction/glob_pattern.rb +140 -0
- data/lib/omnizip/extraction/pattern_matcher.rb +66 -0
- data/lib/omnizip/extraction/predicate_pattern.rb +52 -0
- data/lib/omnizip/extraction/regex_pattern.rb +50 -0
- data/lib/omnizip/extraction/selective_extractor.rb +247 -0
- data/lib/omnizip/extraction.rb +115 -0
- data/lib/omnizip/file_type/mime_classifier.rb +144 -0
- data/lib/omnizip/file_type.rb +117 -0
- data/lib/omnizip/filter.rb +141 -0
- data/lib/omnizip/filter_pipeline.rb +108 -0
- data/lib/omnizip/filter_registry.rb +113 -0
- data/lib/omnizip/filters/bcj.rb +277 -0
- data/lib/omnizip/filters/bcj2/constants.rb +53 -0
- data/lib/omnizip/filters/bcj2/decoder.rb +263 -0
- data/lib/omnizip/filters/bcj2/encoder.rb +58 -0
- data/lib/omnizip/filters/bcj2/stream_data.rb +91 -0
- data/lib/omnizip/filters/bcj2.rb +93 -0
- data/lib/omnizip/filters/bcj_arm.rb +174 -0
- data/lib/omnizip/filters/bcj_arm64.rb +242 -0
- data/lib/omnizip/filters/bcj_ia64.rb +194 -0
- data/lib/omnizip/filters/bcj_ppc.rb +188 -0
- data/lib/omnizip/filters/bcj_sparc.rb +174 -0
- data/lib/omnizip/filters/bcj_x86.rb +191 -0
- data/lib/omnizip/filters/delta.rb +195 -0
- data/lib/omnizip/filters/xz_delta.rb +258 -0
- data/lib/omnizip/filters.rb +20 -0
- data/lib/omnizip/format_detector.rb +166 -0
- data/lib/omnizip/formats/.keep +0 -0
- data/lib/omnizip/formats/bzip2_file.rb +159 -0
- data/lib/omnizip/formats/cpio/bounded_io.rb +66 -0
- data/lib/omnizip/formats/cpio/constants.rb +55 -0
- data/lib/omnizip/formats/cpio/entry.rb +389 -0
- data/lib/omnizip/formats/cpio/reader.rb +194 -0
- data/lib/omnizip/formats/cpio/writer.rb +232 -0
- data/lib/omnizip/formats/cpio.rb +132 -0
- data/lib/omnizip/formats/format_spec_loader.rb +228 -0
- data/lib/omnizip/formats/gzip.rb +236 -0
- data/lib/omnizip/formats/iso/directory_builder.rb +321 -0
- data/lib/omnizip/formats/iso/directory_record.rb +162 -0
- data/lib/omnizip/formats/iso/joliet.rb +204 -0
- data/lib/omnizip/formats/iso/path_table.rb +125 -0
- data/lib/omnizip/formats/iso/reader.rb +194 -0
- data/lib/omnizip/formats/iso/rock_ridge.rb +349 -0
- data/lib/omnizip/formats/iso/volume_builder.rb +319 -0
- data/lib/omnizip/formats/iso/volume_descriptor.rb +168 -0
- data/lib/omnizip/formats/iso/writer.rb +543 -0
- data/lib/omnizip/formats/iso.rb +133 -0
- data/lib/omnizip/formats/lzip.rb +161 -0
- data/lib/omnizip/formats/lzma_alone.rb +149 -0
- data/lib/omnizip/formats/msi/cab_extractor.rb +181 -0
- data/lib/omnizip/formats/msi/constants.rb +157 -0
- data/lib/omnizip/formats/msi/directory_resolver.rb +188 -0
- data/lib/omnizip/formats/msi/entry.rb +134 -0
- data/lib/omnizip/formats/msi/reader.rb +301 -0
- data/lib/omnizip/formats/msi/string_pool.rb +246 -0
- data/lib/omnizip/formats/msi/table_parser.rb +244 -0
- data/lib/omnizip/formats/msi.rb +73 -0
- data/lib/omnizip/formats/ole/allocation_table.rb +263 -0
- data/lib/omnizip/formats/ole/constants.rb +61 -0
- data/lib/omnizip/formats/ole/dirent.rb +439 -0
- data/lib/omnizip/formats/ole/header.rb +199 -0
- data/lib/omnizip/formats/ole/ranges_io.rb +347 -0
- data/lib/omnizip/formats/ole/storage.rb +482 -0
- data/lib/omnizip/formats/ole/types/variant.rb +338 -0
- data/lib/omnizip/formats/ole.rb +143 -0
- data/lib/omnizip/formats/rar/archive_repairer.rb +240 -0
- data/lib/omnizip/formats/rar/archive_verifier.rb +192 -0
- data/lib/omnizip/formats/rar/block_parser.rb +282 -0
- data/lib/omnizip/formats/rar/compression/bit_stream.rb +180 -0
- data/lib/omnizip/formats/rar/compression/dispatcher.rb +210 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/decoder.rb +212 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/encoder.rb +154 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_builder.rb +217 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/huffman_coder.rb +189 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/match_finder.rb +135 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman/sliding_window.rb +165 -0
- data/lib/omnizip/formats/rar/compression/lz77_huffman.rb +25 -0
- data/lib/omnizip/formats/rar/compression/ppmd/context.rb +103 -0
- data/lib/omnizip/formats/rar/compression/ppmd/decoder.rb +238 -0
- data/lib/omnizip/formats/rar/compression/ppmd/encoder.rb +250 -0
- data/lib/omnizip/formats/rar/compression/ppmd.rb +16 -0
- data/lib/omnizip/formats/rar/compression.rb +17 -0
- data/lib/omnizip/formats/rar/compression_method_registry.rb +106 -0
- data/lib/omnizip/formats/rar/constants.rb +88 -0
- data/lib/omnizip/formats/rar/decompressor.rb +316 -0
- data/lib/omnizip/formats/rar/external_writer.rb +311 -0
- data/lib/omnizip/formats/rar/header.rb +209 -0
- data/lib/omnizip/formats/rar/license_validator.rb +111 -0
- data/lib/omnizip/formats/rar/models/rar_archive.rb +77 -0
- data/lib/omnizip/formats/rar/models/rar_entry.rb +65 -0
- data/lib/omnizip/formats/rar/models/rar_volume.rb +56 -0
- data/lib/omnizip/formats/rar/models.rb +14 -0
- data/lib/omnizip/formats/rar/parity_handler.rb +299 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzma.rb +200 -0
- data/lib/omnizip/formats/rar/rar5/compression/lzss.rb +584 -0
- data/lib/omnizip/formats/rar/rar5/compression/store.rb +60 -0
- data/lib/omnizip/formats/rar/rar5/crc32.rb +39 -0
- data/lib/omnizip/formats/rar/rar5/encryption/aes256_cbc.rb +96 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_header.rb +114 -0
- data/lib/omnizip/formats/rar/rar5/encryption/encryption_manager.rb +162 -0
- data/lib/omnizip/formats/rar/rar5/encryption/key_derivation.rb +97 -0
- data/lib/omnizip/formats/rar/rar5/header.rb +208 -0
- data/lib/omnizip/formats/rar/rar5/models/encryption_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/models/recovery_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/solid_options.rb +63 -0
- data/lib/omnizip/formats/rar/rar5/models/volume_options.rb +74 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/ARCHITECTURE.md +290 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_manager.rb +260 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_splitter.rb +155 -0
- data/lib/omnizip/formats/rar/rar5/multi_volume/volume_writer.rb +176 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_encoder.rb +108 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_manager.rb +139 -0
- data/lib/omnizip/formats/rar/rar5/solid/solid_stream.rb +121 -0
- data/lib/omnizip/formats/rar/rar5/vint.rb +53 -0
- data/lib/omnizip/formats/rar/rar5/writer.rb +540 -0
- data/lib/omnizip/formats/rar/rar_format_base.rb +239 -0
- data/lib/omnizip/formats/rar/reader.rb +377 -0
- data/lib/omnizip/formats/rar/recovery_record.rb +245 -0
- data/lib/omnizip/formats/rar/volume_manager.rb +166 -0
- data/lib/omnizip/formats/rar/writer.rb +437 -0
- data/lib/omnizip/formats/rar.rb +193 -0
- data/lib/omnizip/formats/rar3/compressor.rb +71 -0
- data/lib/omnizip/formats/rar3/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar3/reader.rb +107 -0
- data/lib/omnizip/formats/rar3/writer.rb +220 -0
- data/lib/omnizip/formats/rar3.rb +15 -0
- data/lib/omnizip/formats/rar5/compressor.rb +71 -0
- data/lib/omnizip/formats/rar5/decompressor.rb +64 -0
- data/lib/omnizip/formats/rar5/reader.rb +130 -0
- data/lib/omnizip/formats/rar5/writer.rb +65 -0
- data/lib/omnizip/formats/rar5.rb +15 -0
- data/lib/omnizip/formats/rpm/constants.rb +58 -0
- data/lib/omnizip/formats/rpm/entry.rb +106 -0
- data/lib/omnizip/formats/rpm/header.rb +106 -0
- data/lib/omnizip/formats/rpm/lead.rb +132 -0
- data/lib/omnizip/formats/rpm/tag.rb +228 -0
- data/lib/omnizip/formats/rpm/writer.rb +652 -0
- data/lib/omnizip/formats/rpm.rb +458 -0
- data/lib/omnizip/formats/seven_zip/bcj2_stream_decompressor.rb +274 -0
- data/lib/omnizip/formats/seven_zip/coder_chain.rb +169 -0
- data/lib/omnizip/formats/seven_zip/constants.rb +126 -0
- data/lib/omnizip/formats/seven_zip/encoded_header.rb +110 -0
- data/lib/omnizip/formats/seven_zip/encrypted_header.rb +139 -0
- data/lib/omnizip/formats/seven_zip/file_collector.rb +143 -0
- data/lib/omnizip/formats/seven_zip/header.rb +102 -0
- data/lib/omnizip/formats/seven_zip/header_encryptor.rb +132 -0
- data/lib/omnizip/formats/seven_zip/header_writer.rb +425 -0
- data/lib/omnizip/formats/seven_zip/models/coder_info.rb +30 -0
- data/lib/omnizip/formats/seven_zip/models/file_entry.rb +65 -0
- data/lib/omnizip/formats/seven_zip/models/folder.rb +67 -0
- data/lib/omnizip/formats/seven_zip/models/stream_info.rb +42 -0
- data/lib/omnizip/formats/seven_zip/models.rb +20 -0
- data/lib/omnizip/formats/seven_zip/parser.rb +671 -0
- data/lib/omnizip/formats/seven_zip/reader.rb +626 -0
- data/lib/omnizip/formats/seven_zip/split_archive_reader.rb +611 -0
- data/lib/omnizip/formats/seven_zip/split_archive_writer.rb +308 -0
- data/lib/omnizip/formats/seven_zip/stream_compressor.rb +151 -0
- data/lib/omnizip/formats/seven_zip/stream_decompressor.rb +166 -0
- data/lib/omnizip/formats/seven_zip/writer.rb +801 -0
- data/lib/omnizip/formats/seven_zip.rb +179 -0
- data/lib/omnizip/formats/tar/constants.rb +73 -0
- data/lib/omnizip/formats/tar/entry.rb +98 -0
- data/lib/omnizip/formats/tar/header.rb +206 -0
- data/lib/omnizip/formats/tar/reader.rb +119 -0
- data/lib/omnizip/formats/tar/writer.rb +212 -0
- data/lib/omnizip/formats/tar.rb +74 -0
- data/lib/omnizip/formats/xar/constants.rb +119 -0
- data/lib/omnizip/formats/xar/entry.rb +268 -0
- data/lib/omnizip/formats/xar/header.rb +223 -0
- data/lib/omnizip/formats/xar/reader.rb +400 -0
- data/lib/omnizip/formats/xar/toc.rb +570 -0
- data/lib/omnizip/formats/xar/writer.rb +461 -0
- data/lib/omnizip/formats/xar.rb +145 -0
- data/lib/omnizip/formats/xz/reader.rb +121 -0
- data/lib/omnizip/formats/xz/writer.rb +416 -0
- data/lib/omnizip/formats/xz.rb +210 -0
- data/lib/omnizip/formats/xz_const.rb +49 -0
- data/lib/omnizip/formats/xz_impl/block_decoder.rb +761 -0
- data/lib/omnizip/formats/xz_impl/block_encoder.rb +304 -0
- data/lib/omnizip/formats/xz_impl/block_header.rb +210 -0
- data/lib/omnizip/formats/xz_impl/block_header_parser.rb +182 -0
- data/lib/omnizip/formats/xz_impl/index_decoder.rb +174 -0
- data/lib/omnizip/formats/xz_impl/index_encoder.rb +120 -0
- data/lib/omnizip/formats/xz_impl/stream_decoder.rb +470 -0
- data/lib/omnizip/formats/xz_impl/stream_encoder.rb +95 -0
- data/lib/omnizip/formats/xz_impl/stream_footer.rb +79 -0
- data/lib/omnizip/formats/xz_impl/stream_footer_parser.rb +115 -0
- data/lib/omnizip/formats/xz_impl/stream_header.rb +53 -0
- data/lib/omnizip/formats/xz_impl/stream_header_parser.rb +106 -0
- data/lib/omnizip/formats/xz_impl/vli.rb +128 -0
- data/lib/omnizip/formats/xz_impl.rb +52 -0
- data/lib/omnizip/formats/zip/central_directory_header.rb +223 -0
- data/lib/omnizip/formats/zip/constants.rb +69 -0
- data/lib/omnizip/formats/zip/end_of_central_directory.rb +132 -0
- data/lib/omnizip/formats/zip/local_file_header.rb +136 -0
- data/lib/omnizip/formats/zip/reader.rb +376 -0
- data/lib/omnizip/formats/zip/unix_extra_field.rb +153 -0
- data/lib/omnizip/formats/zip/writer.rb +489 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory.rb +102 -0
- data/lib/omnizip/formats/zip/zip64_end_of_central_directory_locator.rb +64 -0
- data/lib/omnizip/formats/zip/zip64_extra_field.rb +112 -0
- data/lib/omnizip/formats/zip.rb +50 -0
- data/lib/omnizip/formats.rb +29 -0
- data/lib/omnizip/implementations/base/lzma2_decoder_base.rb +75 -0
- data/lib/omnizip/implementations/base/lzma2_encoder_base.rb +128 -0
- data/lib/omnizip/implementations/base/lzma_decoder_base.rb +83 -0
- data/lib/omnizip/implementations/base/lzma_encoder_base.rb +108 -0
- data/lib/omnizip/implementations/base/state_machine_base.rb +182 -0
- data/lib/omnizip/implementations/base.rb +19 -0
- data/lib/omnizip/implementations/rust/archive.rb +93 -0
- data/lib/omnizip/implementations/rust/library.rb +221 -0
- data/lib/omnizip/implementations/rust.rb +26 -0
- data/lib/omnizip/implementations/seven_zip/lzma/decoder.rb +428 -0
- data/lib/omnizip/implementations/seven_zip/lzma/encoder.rb +456 -0
- data/lib/omnizip/implementations/seven_zip/lzma/match_finder.rb +285 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_decoder.rb +197 -0
- data/lib/omnizip/implementations/seven_zip/lzma/range_encoder.rb +194 -0
- data/lib/omnizip/implementations/seven_zip/lzma/state_machine.rb +139 -0
- data/lib/omnizip/implementations/seven_zip/lzma.rb +21 -0
- data/lib/omnizip/implementations/seven_zip/lzma2/encoder.rb +56 -0
- data/lib/omnizip/implementations/seven_zip/lzma2.rb +12 -0
- data/lib/omnizip/implementations/seven_zip.rb +11 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/decoder.rb +547 -0
- data/lib/omnizip/implementations/xz_utils/lzma2/encoder.rb +748 -0
- data/lib/omnizip/implementations/xz_utils/lzma2.rb +13 -0
- data/lib/omnizip/implementations/xz_utils.rb +10 -0
- data/lib/omnizip/implementations.rb +25 -0
- data/lib/omnizip/io/buffered_input.rb +147 -0
- data/lib/omnizip/io/buffered_output.rb +106 -0
- data/lib/omnizip/io/source.rb +143 -0
- data/lib/omnizip/io/stream_manager.rb +117 -0
- data/lib/omnizip/io.rb +15 -0
- data/lib/omnizip/link_handler/hard_link.rb +79 -0
- data/lib/omnizip/link_handler/symbolic_link.rb +74 -0
- data/lib/omnizip/link_handler.rb +129 -0
- data/lib/omnizip/metadata/archive_metadata.rb +114 -0
- data/lib/omnizip/metadata/entry_metadata.rb +153 -0
- data/lib/omnizip/metadata/metadata_editor.rb +169 -0
- data/lib/omnizip/metadata/metadata_registry.rb +71 -0
- data/lib/omnizip/metadata/metadata_validator.rb +101 -0
- data/lib/omnizip/metadata.rb +58 -0
- data/lib/omnizip/models/.keep +0 -0
- data/lib/omnizip/models/algorithm_metadata.rb +41 -0
- data/lib/omnizip/models/attribute_apply.rb +40 -0
- data/lib/omnizip/models/compression_options.rb +53 -0
- data/lib/omnizip/models/conversion_options.rb +79 -0
- data/lib/omnizip/models/conversion_result.rb +141 -0
- data/lib/omnizip/models/eta_result.rb +45 -0
- data/lib/omnizip/models/extraction_rule.rb +115 -0
- data/lib/omnizip/models/filter_chain.rb +142 -0
- data/lib/omnizip/models/filter_config.rb +148 -0
- data/lib/omnizip/models/match_result.rb +141 -0
- data/lib/omnizip/models/optimization_suggestion.rb +95 -0
- data/lib/omnizip/models/parallel_options.rb +116 -0
- data/lib/omnizip/models/performance_result.rb +85 -0
- data/lib/omnizip/models/profile_report.rb +116 -0
- data/lib/omnizip/models/progress_options.rb +39 -0
- data/lib/omnizip/models/split_options.rb +116 -0
- data/lib/omnizip/optimization_registry.rb +45 -0
- data/lib/omnizip/parallel/engine.rb +52 -0
- data/lib/omnizip/parallel/job_queue.rb +209 -0
- data/lib/omnizip/parallel/job_scheduler.rb +225 -0
- data/lib/omnizip/parallel/parallel_compressor.rb +326 -0
- data/lib/omnizip/parallel/parallel_extractor.rb +238 -0
- data/lib/omnizip/parallel/thread_pool.rb +60 -0
- data/lib/omnizip/parallel/worker_pool.rb +227 -0
- data/lib/omnizip/parallel.rb +156 -0
- data/lib/omnizip/parity/chunked_block_processor.rb +194 -0
- data/lib/omnizip/parity/galois16.rb +145 -0
- data/lib/omnizip/parity/models/creator_packet.rb +71 -0
- data/lib/omnizip/parity/models/file_description_packet.rb +131 -0
- data/lib/omnizip/parity/models/ifsc_packet.rb +111 -0
- data/lib/omnizip/parity/models/main_packet.rb +126 -0
- data/lib/omnizip/parity/models/packet.rb +156 -0
- data/lib/omnizip/parity/models/packet_registry.rb +102 -0
- data/lib/omnizip/parity/models/recovery_slice_packet.rb +76 -0
- data/lib/omnizip/parity/models.rb +27 -0
- data/lib/omnizip/parity/par2_creator.rb +496 -0
- data/lib/omnizip/parity/par2_repairer.rb +409 -0
- data/lib/omnizip/parity/par2_verifier.rb +373 -0
- data/lib/omnizip/parity/par2cmdline_algorithm.rb +108 -0
- data/lib/omnizip/parity/par2cmdline_coefficients.rb +78 -0
- data/lib/omnizip/parity/reed_solomon_decoder.rb +263 -0
- data/lib/omnizip/parity/reed_solomon_encoder.rb +108 -0
- data/lib/omnizip/parity/reed_solomon_matrix.rb +339 -0
- data/lib/omnizip/parity.rb +207 -0
- data/lib/omnizip/password/encryption_registry.rb +26 -0
- data/lib/omnizip/password/encryption_strategy.rb +96 -0
- data/lib/omnizip/password/password_validator.rb +129 -0
- data/lib/omnizip/password/winzip_aes_strategy.rb +190 -0
- data/lib/omnizip/password/zip_crypto_strategy.rb +135 -0
- data/lib/omnizip/password.rb +88 -0
- data/lib/omnizip/pipe/stream_compressor.rb +124 -0
- data/lib/omnizip/pipe/stream_decompressor.rb +173 -0
- data/lib/omnizip/pipe.rb +120 -0
- data/lib/omnizip/platform/ntfs_streams.rb +200 -0
- data/lib/omnizip/platform.rb +189 -0
- data/lib/omnizip/profile/archive_profile.rb +36 -0
- data/lib/omnizip/profile/balanced_profile.rb +31 -0
- data/lib/omnizip/profile/binary_profile.rb +33 -0
- data/lib/omnizip/profile/compression_profile.rb +157 -0
- data/lib/omnizip/profile/custom_profile.rb +155 -0
- data/lib/omnizip/profile/fast_profile.rb +31 -0
- data/lib/omnizip/profile/maximum_profile.rb +31 -0
- data/lib/omnizip/profile/profile_detector.rb +108 -0
- data/lib/omnizip/profile/profile_registry.rb +160 -0
- data/lib/omnizip/profile/text_profile.rb +33 -0
- data/lib/omnizip/profile.rb +261 -0
- data/lib/omnizip/profiler/memory_profiler.rb +66 -0
- data/lib/omnizip/profiler/method_profiler.rb +49 -0
- data/lib/omnizip/profiler/report_generator.rb +158 -0
- data/lib/omnizip/profiler.rb +192 -0
- data/lib/omnizip/progress/callback_reporter.rb +34 -0
- data/lib/omnizip/progress/console_reporter.rb +59 -0
- data/lib/omnizip/progress/log_reporter.rb +89 -0
- data/lib/omnizip/progress/operation_progress.rb +118 -0
- data/lib/omnizip/progress/progress_bar.rb +156 -0
- data/lib/omnizip/progress/progress_reporter.rb +40 -0
- data/lib/omnizip/progress/progress_tracker.rb +215 -0
- data/lib/omnizip/progress/silent_reporter.rb +22 -0
- data/lib/omnizip/progress.rb +131 -0
- data/lib/omnizip/registry.rb +111 -0
- data/lib/omnizip/rubyzip_compat.rb +61 -0
- data/lib/omnizip/temp/safe_extract.rb +124 -0
- data/lib/omnizip/temp/temp_file.rb +123 -0
- data/lib/omnizip/temp/temp_file_pool.rb +109 -0
- data/lib/omnizip/temp.rb +184 -0
- data/lib/omnizip/version.rb +5 -0
- data/lib/omnizip/zip/entry.rb +160 -0
- data/lib/omnizip/zip/file.rb +485 -0
- data/lib/omnizip/zip/input_stream.rb +270 -0
- data/lib/omnizip/zip/output_stream.rb +320 -0
- data/lib/omnizip/zip.rb +23 -0
- data/lib/omnizip.rb +157 -0
- data/lib/tasks/msi_test_files.rake +66 -0
- data/lib/tasks/platform_gems.rake +147 -0
- data/lib/tasks/rust_backend.rake +48 -0
- data/readme-docs/advanced-features.adoc +514 -0
- data/readme-docs/api-usage.adoc +445 -0
- data/readme-docs/architecture.adoc +450 -0
- data/readme-docs/archive-formats.adoc +479 -0
- data/readme-docs/cli-usage.adoc +222 -0
- data/readme-docs/compression-algorithms.adoc +446 -0
- data/readme-docs/compression-profiles.adoc +247 -0
- data/readme-docs/encryption-checksums.adoc +328 -0
- data/readme-docs/format-converter.adoc +316 -0
- data/readme-docs/installation.adoc +228 -0
- data/readme-docs/par2-archives.adoc +608 -0
- data/readme-docs/performance-profiler.adoc +389 -0
- data/readme-docs/preprocessing-filters.adoc +280 -0
- data/vendor/libomnizip_ffi.so +0 -0
- data/xz-file-format-1.2.1.txt +1174 -0
- metadata +768 -0
|
@@ -0,0 +1,394 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: LZMA
|
|
3
|
+
nav_order: 1
|
|
4
|
+
parent: Compression Algorithms
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
LZMA (Lempel-Ziv-Markov chain Algorithm) is a high-ratio compression algorithm that uses dictionary-based compression combined with range coding. It's the foundation of 7-Zip compression and offers excellent compression ratios with reasonable decompression speed.
|
|
11
|
+
|
|
12
|
+
== Implementation Status
|
|
13
|
+
|
|
14
|
+
**Encoder**: ✅ Production-ready, SDK-compatible +
|
|
15
|
+
**Decoder**: ⚠️ Basic functionality working
|
|
16
|
+
|
|
17
|
+
The LZMA encoder produces byte-for-byte identical output to the reference LZMA SDK implementation. This ensures perfect compatibility with 7-Zip, RAR5, and other tools using LZMA compression.
|
|
18
|
+
|
|
19
|
+
[NOTE]
|
|
20
|
+
====
|
|
21
|
+
The encoder is fully production-ready for creating LZMA-compressed streams. The decoder handles simple cases correctly but may need enhancement for complex multi-byte scenarios. This does not affect the encoder's SDK compatibility.
|
|
22
|
+
====
|
|
23
|
+
|
|
24
|
+
== Key Characteristics
|
|
25
|
+
|
|
26
|
+
[cols="1,3"]
|
|
27
|
+
|===
|
|
28
|
+
|Property |Value
|
|
29
|
+
|
|
30
|
+
|Compression Ratio
|
|
31
|
+
|Excellent (among the best)
|
|
32
|
+
|
|
33
|
+
|Compression Speed
|
|
34
|
+
|Slow to medium
|
|
35
|
+
|
|
36
|
+
|Decompression Speed
|
|
37
|
+
|Fast
|
|
38
|
+
|
|
39
|
+
|Memory Usage
|
|
40
|
+
|Medium to high (dictionary dependent)
|
|
41
|
+
|
|
42
|
+
|Best For
|
|
43
|
+
|General-purpose compression, long-term storage
|
|
44
|
+
|===
|
|
45
|
+
|
|
46
|
+
== When to Use LZMA
|
|
47
|
+
|
|
48
|
+
**Choose LZMA when**:
|
|
49
|
+
|
|
50
|
+
* Maximum compression ratio is priority
|
|
51
|
+
* Files will be compressed once, decompressed many times
|
|
52
|
+
* Storage space is more valuable than compression time
|
|
53
|
+
* Working with general-purpose data (not specific file types)
|
|
54
|
+
|
|
55
|
+
**Avoid LZMA when**:
|
|
56
|
+
|
|
57
|
+
* Speed is more important than compression ratio (use Deflate or Zstandard)
|
|
58
|
+
* Working with already-compressed data (images, videos)
|
|
59
|
+
* Memory is very constrained (use lower dictionary sizes)
|
|
60
|
+
|
|
61
|
+
== Basic Usage
|
|
62
|
+
|
|
63
|
+
=== Compress with LZMA
|
|
64
|
+
|
|
65
|
+
[source,ruby]
|
|
66
|
+
----
|
|
67
|
+
# Create LZMA-compressed archive
|
|
68
|
+
Omnizip::Archive.create('backup.7z', format: :seven_zip,
|
|
69
|
+
algorithm: :lzma, level: 7) do |archive|
|
|
70
|
+
archive.add_directory('project/')
|
|
71
|
+
end
|
|
72
|
+
----
|
|
73
|
+
|
|
74
|
+
=== Decompress LZMA
|
|
75
|
+
|
|
76
|
+
[source,ruby]
|
|
77
|
+
----
|
|
78
|
+
# Extract LZMA-compressed archive
|
|
79
|
+
Omnizip::Archive.open('backup.7z') do |archive|
|
|
80
|
+
archive.extract_all('restored/')
|
|
81
|
+
end
|
|
82
|
+
----
|
|
83
|
+
|
|
84
|
+
== Compression Levels
|
|
85
|
+
|
|
86
|
+
LZMA supports levels 1-9 with different trade-offs:
|
|
87
|
+
|
|
88
|
+
[cols="1,2,2,2,2"]
|
|
89
|
+
|===
|
|
90
|
+
|Level |Dictionary |Speed |Ratio |Best For
|
|
91
|
+
|
|
92
|
+
|1-2
|
|
93
|
+
|1-2 MB
|
|
94
|
+
|Fast
|
|
95
|
+
|Good
|
|
96
|
+
|Quick compression
|
|
97
|
+
|
|
98
|
+
|3-4
|
|
99
|
+
|4 MB
|
|
100
|
+
|Medium
|
|
101
|
+
|Very Good
|
|
102
|
+
|Balanced use
|
|
103
|
+
|
|
104
|
+
|5-6
|
|
105
|
+
|8-16 MB
|
|
106
|
+
|Slow
|
|
107
|
+
|Excellent
|
|
108
|
+
|**Default** - good balance
|
|
109
|
+
|
|
110
|
+
|7-8
|
|
111
|
+
|32 MB
|
|
112
|
+
|Very Slow
|
|
113
|
+
|Excellent+
|
|
114
|
+
|Maximum compression
|
|
115
|
+
|
|
116
|
+
|9
|
|
117
|
+
|64 MB
|
|
118
|
+
|Slowest
|
|
119
|
+
|Best
|
|
120
|
+
|Long-term archival
|
|
121
|
+
|===
|
|
122
|
+
|
|
123
|
+
.Compression Level Example
|
|
124
|
+
[source,ruby]
|
|
125
|
+
----
|
|
126
|
+
# Fast compression (level 3)
|
|
127
|
+
Omnizip.compress_file('data.txt', 'fast.7z',
|
|
128
|
+
compression: :lzma,
|
|
129
|
+
level: 3
|
|
130
|
+
)
|
|
131
|
+
|
|
132
|
+
# Maximum compression (level 9)
|
|
133
|
+
Omnizip.compress_file('data.txt', 'maximum.7z',
|
|
134
|
+
compression: :lzma,
|
|
135
|
+
level: 9
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
# Results comparison:
|
|
139
|
+
# Level 3: 1.2 MB in 2 seconds
|
|
140
|
+
# Level 9: 0.9 MB in 12 seconds (25% better, 6x slower)
|
|
141
|
+
----
|
|
142
|
+
|
|
143
|
+
== Performance Characteristics
|
|
144
|
+
|
|
145
|
+
=== Compression Performance
|
|
146
|
+
|
|
147
|
+
[cols="2,1,1,1"]
|
|
148
|
+
|===
|
|
149
|
+
|File Size |Level 5 Time |Level 9 Time |Ratio Improvement
|
|
150
|
+
|
|
151
|
+
|1 MB
|
|
152
|
+
|0.3s
|
|
153
|
+
|1.5s
|
|
154
|
+
|~10%
|
|
155
|
+
|
|
156
|
+
|10 MB
|
|
157
|
+
|3s
|
|
158
|
+
|15s
|
|
159
|
+
|~15%
|
|
160
|
+
|
|
161
|
+
|100 MB
|
|
162
|
+
|30s
|
|
163
|
+
|180s
|
|
164
|
+
|~20%
|
|
165
|
+
|
|
166
|
+
|1 GB
|
|
167
|
+
|5min
|
|
168
|
+
|30min
|
|
169
|
+
|~25%
|
|
170
|
+
|===
|
|
171
|
+
|
|
172
|
+
=== Memory Requirements
|
|
173
|
+
|
|
174
|
+
Dictionary size determines memory usage:
|
|
175
|
+
|
|
176
|
+
[cols="1,1,1,1"]
|
|
177
|
+
|===
|
|
178
|
+
|Level |Dictionary |Compression RAM |Decompression RAM
|
|
179
|
+
|
|
180
|
+
|1-2
|
|
181
|
+
|1-2 MB
|
|
182
|
+
|~10 MB
|
|
183
|
+
|~2 MB
|
|
184
|
+
|
|
185
|
+
|3-4
|
|
186
|
+
|4 MB
|
|
187
|
+
|~40 MB
|
|
188
|
+
|~5 MB
|
|
189
|
+
|
|
190
|
+
|5-6
|
|
191
|
+
|8-16 MB
|
|
192
|
+
|~100 MB
|
|
193
|
+
|~20 MB
|
|
194
|
+
|
|
195
|
+
|7-9
|
|
196
|
+
|32-64 MB
|
|
197
|
+
|~400 MB
|
|
198
|
+
|~70 MB
|
|
199
|
+
|===
|
|
200
|
+
|
|
201
|
+
== Algorithm Details
|
|
202
|
+
|
|
203
|
+
=== How LZMA Works
|
|
204
|
+
|
|
205
|
+
LZMA operates in three stages:
|
|
206
|
+
|
|
207
|
+
. **LZ77 Matching**: Find repeated sequences in a sliding window dictionary
|
|
208
|
+
. **Range Encoding**: Encode matches and literals using adaptive probability models
|
|
209
|
+
. **State Machine**: Track context for better prediction
|
|
210
|
+
|
|
211
|
+
[source]
|
|
212
|
+
----
|
|
213
|
+
Input Data
|
|
214
|
+
│
|
|
215
|
+
▼
|
|
216
|
+
┌─────────────┐
|
|
217
|
+
│ LZ77 Match │ Find repeated sequences
|
|
218
|
+
│ Finder │ in dictionary window
|
|
219
|
+
└──────┬──────┘
|
|
220
|
+
│ Matches + Literals
|
|
221
|
+
▼
|
|
222
|
+
┌─────────────┐
|
|
223
|
+
│ Range │ Encode using probability
|
|
224
|
+
│ Encoder │ models and arithmetic coding
|
|
225
|
+
└──────┬──────┘
|
|
226
|
+
│ Compressed bitstream
|
|
227
|
+
▼
|
|
228
|
+
┌─────────────┐
|
|
229
|
+
│ Output │ Final compressed data
|
|
230
|
+
│ Stream │
|
|
231
|
+
└─────────────┘
|
|
232
|
+
----
|
|
233
|
+
|
|
234
|
+
=== Dictionary Size Impact
|
|
235
|
+
|
|
236
|
+
Larger dictionaries find more matches but use more memory:
|
|
237
|
+
|
|
238
|
+
[source,ruby]
|
|
239
|
+
----
|
|
240
|
+
# Small dictionary (fast, less compression)
|
|
241
|
+
Omnizip.compress_file('file.txt', 'small-dict.7z',
|
|
242
|
+
compression: :lzma,
|
|
243
|
+
dictionary_size: 1.megabyte # 1 MB dictionary
|
|
244
|
+
)
|
|
245
|
+
|
|
246
|
+
# Large dictionary (slow, better compression)
|
|
247
|
+
Omnizip.compress_file('file.txt', 'large-dict.7z',
|
|
248
|
+
compression: :lzma,
|
|
249
|
+
dictionary_size: 64.megabytes # 64 MB dictionary
|
|
250
|
+
)
|
|
251
|
+
----
|
|
252
|
+
|
|
253
|
+
== Optimization Tips
|
|
254
|
+
|
|
255
|
+
=== Choose Appropriate Level
|
|
256
|
+
|
|
257
|
+
[source,ruby]
|
|
258
|
+
----
|
|
259
|
+
# For testing/development (fast feedback)
|
|
260
|
+
level: 3
|
|
261
|
+
|
|
262
|
+
# For production backups (balanced)
|
|
263
|
+
level: 5 # Default
|
|
264
|
+
|
|
265
|
+
# For archival/distribution (maximum compression)
|
|
266
|
+
level: 9
|
|
267
|
+
----
|
|
268
|
+
|
|
269
|
+
=== Adjust Dictionary Size
|
|
270
|
+
|
|
271
|
+
Match dictionary to file characteristics:
|
|
272
|
+
|
|
273
|
+
[source,ruby]
|
|
274
|
+
----
|
|
275
|
+
# Small files (<1 MB)
|
|
276
|
+
dictionary_size: 1.megabyte
|
|
277
|
+
|
|
278
|
+
# Medium files (1-100 MB)
|
|
279
|
+
dictionary_size: 8.megabytes # Default for level 5
|
|
280
|
+
|
|
281
|
+
# Large files (>100 MB)
|
|
282
|
+
dictionary_size: 32.megabytes
|
|
283
|
+
----
|
|
284
|
+
|
|
285
|
+
=== Combine with Filters
|
|
286
|
+
|
|
287
|
+
Improve compression of executables:
|
|
288
|
+
|
|
289
|
+
[source,ruby]
|
|
290
|
+
----
|
|
291
|
+
# Compress executable with BCJ filter
|
|
292
|
+
Omnizip::Archive.create('app.7z', format: :seven_zip,
|
|
293
|
+
algorithm: :lzma, level: 9,
|
|
294
|
+
filters: [:bcj_x86]) do |archive| # For x86 executables
|
|
295
|
+
archive.add_file('application.exe')
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# Can improve compression by 10-30% for executables
|
|
299
|
+
----
|
|
300
|
+
|
|
301
|
+
== Comparison with Other Algorithms
|
|
302
|
+
|
|
303
|
+
[cols="2,1,1,1,1"]
|
|
304
|
+
|===
|
|
305
|
+
|Algorithm |Ratio |Comp Speed |Decomp Speed |Use Case
|
|
306
|
+
|
|
307
|
+
|**LZMA**
|
|
308
|
+
|Excellent
|
|
309
|
+
|Slow
|
|
310
|
+
|Fast
|
|
311
|
+
|General purpose
|
|
312
|
+
|
|
313
|
+
|LZMA2
|
|
314
|
+
|Excellent
|
|
315
|
+
|Slow
|
|
316
|
+
|Fast
|
|
317
|
+
|Multi-threading
|
|
318
|
+
|
|
319
|
+
|Deflate
|
|
320
|
+
|Good
|
|
321
|
+
|Fast
|
|
322
|
+
|Fast
|
|
323
|
+
|Speed priority
|
|
324
|
+
|
|
325
|
+
|PPMd
|
|
326
|
+
|Excellent
|
|
327
|
+
|Very Slow
|
|
328
|
+
|Slow
|
|
329
|
+
|Text files
|
|
330
|
+
|
|
331
|
+
|Zstandard
|
|
332
|
+
|Very Good
|
|
333
|
+
|Very Fast
|
|
334
|
+
|Very Fast
|
|
335
|
+
|Real-time compression
|
|
336
|
+
|===
|
|
337
|
+
|
|
338
|
+
== Common Use Cases
|
|
339
|
+
|
|
340
|
+
=== Software Distribution
|
|
341
|
+
|
|
342
|
+
[source,ruby]
|
|
343
|
+
----
|
|
344
|
+
# Package software release with maximum compression
|
|
345
|
+
Omnizip::Archive.create("app-v1.0.7z", format: :seven_zip,
|
|
346
|
+
algorithm: :lzma, level: 9,
|
|
347
|
+
solid: true) do |archive| # Even better compression
|
|
348
|
+
archive.add_directory('release/')
|
|
349
|
+
end
|
|
350
|
+
----
|
|
351
|
+
|
|
352
|
+
=== Data Archival
|
|
353
|
+
|
|
354
|
+
[source,ruby]
|
|
355
|
+
----
|
|
356
|
+
# Archive old data with best compression
|
|
357
|
+
Omnizip.compress_directory(
|
|
358
|
+
'old_logs_2023/',
|
|
359
|
+
'archive_2023.7z',
|
|
360
|
+
compression: :lzma,
|
|
361
|
+
level: 9,
|
|
362
|
+
description: "Archived logs from 2023"
|
|
363
|
+
)
|
|
364
|
+
----
|
|
365
|
+
|
|
366
|
+
=== Backup Systems
|
|
367
|
+
|
|
368
|
+
[source,ruby]
|
|
369
|
+
----
|
|
370
|
+
# Daily backup with good compression
|
|
371
|
+
Omnizip.compress_directory(
|
|
372
|
+
'/var/www/',
|
|
373
|
+
"backup_#{Date.today}.7z",
|
|
374
|
+
algorithm: :lzma,
|
|
375
|
+
level: 6 # Balanced
|
|
376
|
+
)
|
|
377
|
+
----
|
|
378
|
+
|
|
379
|
+
== Technical Specifications
|
|
380
|
+
|
|
381
|
+
* **Algorithm Family**: Dictionary-based + Statistical
|
|
382
|
+
* **Window Size**: Up to 4 GB (theoretical), typically 1-64 MB
|
|
383
|
+
* **Match Length**: 2-273 bytes
|
|
384
|
+
* **Range Encoding**: Arithmetic coding with adaptive probability
|
|
385
|
+
* **Context**: Up to 4 bits of context for better prediction
|
|
386
|
+
* **Bit Compatibility**: 100% compatible with 7-Zip LZMA
|
|
387
|
+
|
|
388
|
+
== See Also
|
|
389
|
+
|
|
390
|
+
* link:lzma2.html[LZMA2] - Enhanced LZMA with better multi-threading
|
|
391
|
+
* link:deflate.html[Deflate] - Faster alternative for less compression
|
|
392
|
+
* link:ppmd.html[PPMd] - Better for text files
|
|
393
|
+
* link:../advanced-features/parallel-processing.html[Parallel Processing] - Speed up compression
|
|
394
|
+
* link:../../compatibility.html[Compatibility Matrix] - Algorithm support across tools
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: LZMA2
|
|
3
|
+
nav_order: 2
|
|
4
|
+
parent: Compression Algorithms
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
LZMA2 is an enhanced version of LZMA designed for better multi-threading support and improved handling of incompressible data. It's the default compression algorithm for modern 7-Zip archives.
|
|
11
|
+
|
|
12
|
+
== Key Characteristics
|
|
13
|
+
|
|
14
|
+
[cols="1,3"]
|
|
15
|
+
|===
|
|
16
|
+
|Property |Value
|
|
17
|
+
|
|
18
|
+
|Compression Ratio
|
|
19
|
+
|Excellent (same as LZMA)
|
|
20
|
+
|
|
21
|
+
|Compression Speed
|
|
22
|
+
|Slow to medium (single-threaded)
|
|
23
|
+
|
|
24
|
+
|Decompression Speed
|
|
25
|
+
|Fast
|
|
26
|
+
|
|
27
|
+
|Memory Usage
|
|
28
|
+
|Medium to high
|
|
29
|
+
|
|
30
|
+
|Multi-Threading
|
|
31
|
+
|Excellent support
|
|
32
|
+
|
|
33
|
+
|Best For
|
|
34
|
+
|Multi-core systems, modern archives, mixed content
|
|
35
|
+
|===
|
|
36
|
+
|
|
37
|
+
== LZMA2 vs LZMA
|
|
38
|
+
|
|
39
|
+
[cols="2,1,1,3"]
|
|
40
|
+
|===
|
|
41
|
+
|Feature |LZMA |LZMA2 |Advantage
|
|
42
|
+
|
|
43
|
+
|Compression Ratio
|
|
44
|
+
|Excellent
|
|
45
|
+
|Excellent
|
|
46
|
+
|Same quality
|
|
47
|
+
|
|
48
|
+
|Multi-Threading
|
|
49
|
+
|Limited
|
|
50
|
+
|Excellent
|
|
51
|
+
|LZMA2 chunks are independent, but Omnizip's encoder is single-threaded
|
|
52
|
+
|
|
53
|
+
|Incompressible Data
|
|
54
|
+
|Poor
|
|
55
|
+
|Good
|
|
56
|
+
|LZMA2 handles better
|
|
57
|
+
|
|
58
|
+
|Chunk Independence
|
|
59
|
+
|No
|
|
60
|
+
|Yes
|
|
61
|
+
|LZMA2 can reset dictionary
|
|
62
|
+
|
|
63
|
+
|Default in 7-Zip
|
|
64
|
+
|No
|
|
65
|
+
|Yes
|
|
66
|
+
|LZMA2 is modern default
|
|
67
|
+
|
|
68
|
+
|Streaming
|
|
69
|
+
|Limited
|
|
70
|
+
|Better
|
|
71
|
+
|LZMA2 designed for streaming
|
|
72
|
+
|===
|
|
73
|
+
|
|
74
|
+
== When to Use LZMA2
|
|
75
|
+
|
|
76
|
+
**Choose LZMA2 when**:
|
|
77
|
+
|
|
78
|
+
* Working with mixed content (text + binary + compressed)
|
|
79
|
+
* Creating modern 7z archives (it's the default)
|
|
80
|
+
* Need better streaming support
|
|
81
|
+
* Want future-proof archives
|
|
82
|
+
|
|
83
|
+
**Use LZMA instead when**:
|
|
84
|
+
|
|
85
|
+
* Single-threaded environment
|
|
86
|
+
* Maintaining compatibility with old 7-Zip versions (<9.20)
|
|
87
|
+
* Slightly better compression ratio is critical
|
|
88
|
+
|
|
89
|
+
== Basic Usage
|
|
90
|
+
|
|
91
|
+
=== Create LZMA2 Archive
|
|
92
|
+
|
|
93
|
+
[source,ruby]
|
|
94
|
+
----
|
|
95
|
+
# Create with LZMA2 (modern default)
|
|
96
|
+
# :lzma2 is the default algorithm for 7z
|
|
97
|
+
Omnizip::Archive.create('backup.7z', format: :seven_zip,
|
|
98
|
+
algorithm: :lzma2, level: 9) do |archive|
|
|
99
|
+
archive.add_directory('project/')
|
|
100
|
+
end
|
|
101
|
+
----
|
|
102
|
+
|
|
103
|
+
=== With Parallel Processing
|
|
104
|
+
|
|
105
|
+
Omnizip's codecs are pure Ruby and single-threaded: there is no
|
|
106
|
+
+parallel:+ or +threads:+ option. To use multiple cores, run
|
|
107
|
+
several archive operations in separate processes instead (see the
|
|
108
|
+
link:../advanced-features/parallel-processing.html[Parallel
|
|
109
|
+
Processing guide]).
|
|
110
|
+
|
|
111
|
+
== Compression Levels
|
|
112
|
+
|
|
113
|
+
Same levels as LZMA (1-9):
|
|
114
|
+
|
|
115
|
+
[cols="1,2,2,2"]
|
|
116
|
+
|===
|
|
117
|
+
|Level |Dictionary |Single-Thread |Multi-Thread (4 cores)
|
|
118
|
+
|
|
119
|
+
|5
|
|
120
|
+
|16 MB
|
|
121
|
+
|30s
|
|
122
|
+
|12s (2.5x faster)
|
|
123
|
+
|
|
124
|
+
|7
|
|
125
|
+
|32 MB
|
|
126
|
+
|60s
|
|
127
|
+
|22s (2.7x faster)
|
|
128
|
+
|
|
129
|
+
|9
|
|
130
|
+
|64 MB
|
|
131
|
+
|180s
|
|
132
|
+
|65s (2.8x faster)
|
|
133
|
+
|===
|
|
134
|
+
|
|
135
|
+
== Advanced Configuration
|
|
136
|
+
|
|
137
|
+
=== Dictionary Size
|
|
138
|
+
|
|
139
|
+
LZMA2's dictionary size follows the compression +level:+. It can
|
|
140
|
+
also be set explicitly:
|
|
141
|
+
|
|
142
|
+
[source,ruby]
|
|
143
|
+
----
|
|
144
|
+
# 64 MB dictionary for large homogeneous datasets
|
|
145
|
+
Omnizip::Archive.create('dataset.7z', format: :seven_zip,
|
|
146
|
+
algorithm: :lzma2,
|
|
147
|
+
dict_size: 64 * 1024 * 1024) do |archive|
|
|
148
|
+
archive.add_directory('mixed_data/') # Text + images + binaries
|
|
149
|
+
end
|
|
150
|
+
----
|
|
151
|
+
|
|
152
|
+
== Performance Characteristics
|
|
153
|
+
|
|
154
|
+
=== Parallel Speedup
|
|
155
|
+
|
|
156
|
+
Not applicable: Omnizip's codecs are pure Ruby and single-threaded.
|
|
157
|
+
Compression of independent archives can be parallelized at the
|
|
158
|
+
process level (see the link:../advanced-features/parallel-processing.html[Parallel Processing guide]).
|
|
159
|
+
|
|
160
|
+
=== Incompressible Data Handling
|
|
161
|
+
|
|
162
|
+
LZMA2 handles incompressible data more efficiently:
|
|
163
|
+
|
|
164
|
+
[source]
|
|
165
|
+
----
|
|
166
|
+
File Type LZMA Time LZMA2 Time Improvement
|
|
167
|
+
─────────────────────────────────────────────────────
|
|
168
|
+
JPEG images 45s 32s ~30% faster
|
|
169
|
+
Mixed archive 60s 40s ~33% faster
|
|
170
|
+
Video files 38s 25s ~34% faster
|
|
171
|
+
Pure text 30s 30s Same
|
|
172
|
+
----
|
|
173
|
+
|
|
174
|
+
== Use Cases
|
|
175
|
+
|
|
176
|
+
=== Server Backups
|
|
177
|
+
|
|
178
|
+
[source,ruby]
|
|
179
|
+
----
|
|
180
|
+
Omnizip.compress_directory(
|
|
181
|
+
'/var/www/',
|
|
182
|
+
'www-backup.7z',
|
|
183
|
+
algorithm: :lzma2,
|
|
184
|
+
level: 9
|
|
185
|
+
)
|
|
186
|
+
----
|
|
187
|
+
|
|
188
|
+
=== Large Dataset Compression
|
|
189
|
+
|
|
190
|
+
Process large datasets efficiently:
|
|
191
|
+
|
|
192
|
+
[source,ruby]
|
|
193
|
+
----
|
|
194
|
+
# Compress large research dataset
|
|
195
|
+
Omnizip::Archive.create('dataset.7z', format: :seven_zip,
|
|
196
|
+
algorithm: :lzma2, level: 9,
|
|
197
|
+
solid: true) do |archive| # Better compression
|
|
198
|
+
# Add gigabytes of data
|
|
199
|
+
archive.add_directory('research_data/')
|
|
200
|
+
end
|
|
201
|
+
----
|
|
202
|
+
|
|
203
|
+
=== Software Build Artifacts
|
|
204
|
+
|
|
205
|
+
Package build outputs (BCJ filter for executables):
|
|
206
|
+
|
|
207
|
+
[source,ruby]
|
|
208
|
+
----
|
|
209
|
+
# Package release after build
|
|
210
|
+
Omnizip.compress_directory(
|
|
211
|
+
'build/release/',
|
|
212
|
+
"app-#{version}.7z",
|
|
213
|
+
algorithm: :lzma2,
|
|
214
|
+
level: 7,
|
|
215
|
+
filters: [:bcj_x86]
|
|
216
|
+
)
|
|
217
|
+
----
|
|
218
|
+
|
|
219
|
+
== Command-Line Usage
|
|
220
|
+
|
|
221
|
+
[source,bash]
|
|
222
|
+
----
|
|
223
|
+
# Create LZMA2 archive
|
|
224
|
+
$ omnizip archive create backup.7z files/ \
|
|
225
|
+
--algorithm lzma2 \
|
|
226
|
+
--level 9
|
|
227
|
+
----
|
|
228
|
+
|
|
229
|
+
== Technical Details
|
|
230
|
+
|
|
231
|
+
**LZMA2 Improvements over LZMA**:
|
|
232
|
+
|
|
233
|
+
. **Chunk-Based**: Data divided into independent chunks (which is what allows multi-threaded encoders; Omnizip's is single-threaded)
|
|
234
|
+
. **Dictionary Reset**: Can reset dictionary between chunks
|
|
235
|
+
. **Uncompressed Chunks**: Stores incompressible data without overhead
|
|
236
|
+
. **Better Streaming**: Designed for better streaming support
|
|
237
|
+
. **Error Recovery**: Better error isolation (chunk-level vs. stream-level)
|
|
238
|
+
|
|
239
|
+
== See Also
|
|
240
|
+
|
|
241
|
+
* link:lzma.html[LZMA] - Original algorithm
|
|
242
|
+
* link:zstandard.html[Zstandard] - Fast alternative
|
|
243
|
+
* link:../advanced-features/parallel-processing.html[Parallel Processing] - Process-level parallelism for multiple archives
|
|
244
|
+
* link:../../compatibility.html[Compatibility] - LZMA2 support across tools
|