omnizip 0.4.7-aarch64-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,313 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: PPMd
|
|
3
|
+
nav_order: 6
|
|
4
|
+
parent: Compression Algorithms
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
PPMd7 (Prediction by Partial Matching, variant H revision 7) is a statistical compression algorithm that excels at compressing text files. It achieves excellent compression ratios on source code, documents, and repetitive text.
|
|
11
|
+
|
|
12
|
+
== Key Characteristics
|
|
13
|
+
|
|
14
|
+
[cols="1,3"]
|
|
15
|
+
|===
|
|
16
|
+
|Property |Value
|
|
17
|
+
|
|
18
|
+
|Compression Ratio
|
|
19
|
+
|Excellent (best for text)
|
|
20
|
+
|
|
21
|
+
|Compression Speed
|
|
22
|
+
|Slow
|
|
23
|
+
|
|
24
|
+
|Decompression Speed
|
|
25
|
+
|Slow
|
|
26
|
+
|
|
27
|
+
|Memory Usage
|
|
28
|
+
|High (configurable)
|
|
29
|
+
|
|
30
|
+
|Best For
|
|
31
|
+
|Text files, source code, XML/JSON, logs
|
|
32
|
+
|===
|
|
33
|
+
|
|
34
|
+
== When to Use PPMd7
|
|
35
|
+
|
|
36
|
+
**Choose PPMd7 when**:
|
|
37
|
+
|
|
38
|
+
* Compressing primarily text data
|
|
39
|
+
* Source code archives
|
|
40
|
+
* XML, JSON, or structured text files
|
|
41
|
+
* Log file archives
|
|
42
|
+
* Maximum text compression is needed
|
|
43
|
+
|
|
44
|
+
**Avoid PPMd7 when**:
|
|
45
|
+
|
|
46
|
+
* Working with binary data (use LZMA2)
|
|
47
|
+
* Working with already-compressed files
|
|
48
|
+
* Speed is more important than ratio
|
|
49
|
+
* Memory is very limited
|
|
50
|
+
|
|
51
|
+
== Basic Usage
|
|
52
|
+
|
|
53
|
+
=== Compress Text Files
|
|
54
|
+
|
|
55
|
+
[source,ruby]
|
|
56
|
+
----
|
|
57
|
+
# Compress source code with PPMd7
|
|
58
|
+
Omnizip::Archive.create('code.7z', format: :seven_zip,
|
|
59
|
+
algorithm: :ppmd7) do |archive|
|
|
60
|
+
archive.add_directory('src/')
|
|
61
|
+
end
|
|
62
|
+
----
|
|
63
|
+
|
|
64
|
+
=== Memory and Order
|
|
65
|
+
|
|
66
|
+
PPMd memory (2^mem_size bytes) and context order are encoder
|
|
67
|
+
parameters; the writer currently emits PPMd with default settings
|
|
68
|
+
(empty properties, which readers interpret as defaults), so there
|
|
69
|
+
are no +mem_size:/+order: knobs yet:
|
|
70
|
+
|
|
71
|
+
[source,ruby]
|
|
72
|
+
----
|
|
73
|
+
Omnizip::Archive.create('text.7z', format: :seven_zip,
|
|
74
|
+
algorithm: :ppmd7) do |archive|
|
|
75
|
+
archive.add_directory('documents/')
|
|
76
|
+
end
|
|
77
|
+
----
|
|
78
|
+
|
|
79
|
+
== Configuration Parameters
|
|
80
|
+
|
|
81
|
+
The writer currently emits PPMd with default memory/order settings;
|
|
82
|
+
the tables below describe the algorithm's parameters for reference
|
|
83
|
+
when choosing PPMd.
|
|
84
|
+
|
|
85
|
+
=== Memory Size
|
|
86
|
+
|
|
87
|
+
Controls context tree size (2^mem_size bytes):
|
|
88
|
+
|
|
89
|
+
[cols="1,1,2,2"]
|
|
90
|
+
|===
|
|
91
|
+
|mem_size |Memory |Compression |Best For
|
|
92
|
+
|
|
93
|
+
|20
|
|
94
|
+
|1 MB
|
|
95
|
+
|Good
|
|
96
|
+
|Small files, limited memory
|
|
97
|
+
|
|
98
|
+
|22
|
|
99
|
+
|4 MB
|
|
100
|
+
|Very Good
|
|
101
|
+
|Most text files
|
|
102
|
+
|
|
103
|
+
|24
|
|
104
|
+
|16 MB
|
|
105
|
+
|Excellent
|
|
106
|
+
|**Default** - large texts
|
|
107
|
+
|
|
108
|
+
|26
|
|
109
|
+
|64 MB
|
|
110
|
+
|Best
|
|
111
|
+
|Very large text corpora
|
|
112
|
+
|
|
113
|
+
|28
|
|
114
|
+
|256 MB
|
|
115
|
+
|Maximum
|
|
116
|
+
|Huge text archives
|
|
117
|
+
|===
|
|
118
|
+
|
|
119
|
+
=== Context Order
|
|
120
|
+
|
|
121
|
+
Number of previous characters used for prediction:
|
|
122
|
+
|
|
123
|
+
[cols="1,2,2"]
|
|
124
|
+
|===
|
|
125
|
+
|Order |Compression |Speed
|
|
126
|
+
|
|
127
|
+
|4
|
|
128
|
+
|Good
|
|
129
|
+
|Faster
|
|
130
|
+
|
|
131
|
+
|6
|
|
132
|
+
|Excellent
|
|
133
|
+
|**Default**
|
|
134
|
+
|
|
135
|
+
|8
|
|
136
|
+
|Best
|
|
137
|
+
|Slower
|
|
138
|
+
|
|
139
|
+
|16
|
|
140
|
+
|Maximum
|
|
141
|
+
|Very slow
|
|
142
|
+
|===
|
|
143
|
+
|
|
144
|
+
.Configuration Example
|
|
145
|
+
[source,ruby]
|
|
146
|
+
----
|
|
147
|
+
# For large source code archive
|
|
148
|
+
Omnizip::Archive.create('linux-kernel.7z', format: :seven_zip,
|
|
149
|
+
algorithm: :ppmd7) do |archive|
|
|
150
|
+
archive.add_directory('linux-6.0/')
|
|
151
|
+
end
|
|
152
|
+
----
|
|
153
|
+
|
|
154
|
+
== Performance Characteristics
|
|
155
|
+
|
|
156
|
+
=== Compression Ratios (Text Files)
|
|
157
|
+
|
|
158
|
+
[cols="2,1,1,1"]
|
|
159
|
+
|===
|
|
160
|
+
|Content Type |Deflate |LZMA2 |PPMd7
|
|
161
|
+
|
|
162
|
+
|Source Code (.rb, .js)
|
|
163
|
+
|65%
|
|
164
|
+
|72%
|
|
165
|
+
|78%
|
|
166
|
+
|
|
167
|
+
|XML/JSON
|
|
168
|
+
|68%
|
|
169
|
+
|75%
|
|
170
|
+
|82%
|
|
171
|
+
|
|
172
|
+
|Plain Text
|
|
173
|
+
|62%
|
|
174
|
+
|70%
|
|
175
|
+
|80%
|
|
176
|
+
|
|
177
|
+
|Logs (repetitive)
|
|
178
|
+
|70%
|
|
179
|
+
|76%
|
|
180
|
+
|85%
|
|
181
|
+
|===
|
|
182
|
+
|
|
183
|
+
=== Speed Comparison
|
|
184
|
+
|
|
185
|
+
For 10 MB text file:
|
|
186
|
+
|
|
187
|
+
[cols="2,1,1,1"]
|
|
188
|
+
|===
|
|
189
|
+
|Algorithm |Compress Time |Decompress Time |Ratio
|
|
190
|
+
|
|
191
|
+
|**PPMd7**
|
|
192
|
+
|25s
|
|
193
|
+
|18s
|
|
194
|
+
|80%
|
|
195
|
+
|
|
196
|
+
|LZMA2
|
|
197
|
+
|15s
|
|
198
|
+
|2s
|
|
199
|
+
|75%
|
|
200
|
+
|
|
201
|
+
|Deflate
|
|
202
|
+
|3s
|
|
203
|
+
|1s
|
|
204
|
+
|65%
|
|
205
|
+
|
|
206
|
+
|Zstandard
|
|
207
|
+
|1s
|
|
208
|
+
|0.5s
|
|
209
|
+
|68%
|
|
210
|
+
|===
|
|
211
|
+
|
|
212
|
+
== Common Use Cases
|
|
213
|
+
|
|
214
|
+
=== Source Code Archives
|
|
215
|
+
|
|
216
|
+
[source,ruby]
|
|
217
|
+
----
|
|
218
|
+
# Archive project source code
|
|
219
|
+
Omnizip::Archive.create("project-v1.0.7z", format: :seven_zip,
|
|
220
|
+
algorithm: :ppmd7) do |archive|
|
|
221
|
+
archive.add_directory('src/')
|
|
222
|
+
archive.add_directory('tests/')
|
|
223
|
+
archive.add_file('README.md')
|
|
224
|
+
end
|
|
225
|
+
----
|
|
226
|
+
|
|
227
|
+
=== Log File Compression
|
|
228
|
+
|
|
229
|
+
[source,ruby]
|
|
230
|
+
----
|
|
231
|
+
# Compress application logs with maximum ratio
|
|
232
|
+
log_files = Dir.glob('/var/log/app/*.log')
|
|
233
|
+
|
|
234
|
+
Omnizip::Archive.create("logs_#{Date.today}.7z",
|
|
235
|
+
format: :seven_zip,
|
|
236
|
+
algorithm: :ppmd7) do |archive|
|
|
237
|
+
log_files.each { |log| archive.add_file(log) }
|
|
238
|
+
end
|
|
239
|
+
----
|
|
240
|
+
|
|
241
|
+
=== Documentation Archives
|
|
242
|
+
|
|
243
|
+
[source,ruby]
|
|
244
|
+
----
|
|
245
|
+
# Compress documentation and markup files
|
|
246
|
+
Omnizip::Archive.create('docs.7z', format: :seven_zip,
|
|
247
|
+
algorithm: :ppmd7) do |archive|
|
|
248
|
+
archive.add_directory('docs/')
|
|
249
|
+
archive.add_directory('wiki/')
|
|
250
|
+
archive.add_directory('examples/')
|
|
251
|
+
end
|
|
252
|
+
----
|
|
253
|
+
|
|
254
|
+
== PPMd7 vs PPMd8
|
|
255
|
+
|
|
256
|
+
Both are variants of PPMd with slight differences:
|
|
257
|
+
|
|
258
|
+
[cols="2,1,1,2"]
|
|
259
|
+
|===
|
|
260
|
+
|Characteristic |PPMd7 |PPMd8 |Recommendation
|
|
261
|
+
|
|
262
|
+
|Compression Ratio
|
|
263
|
+
|Excellent
|
|
264
|
+
|Excellent
|
|
265
|
+
|Similar quality
|
|
266
|
+
|
|
267
|
+
|Speed
|
|
268
|
+
|Slow
|
|
269
|
+
|Slow
|
|
270
|
+
|Similar performance
|
|
271
|
+
|
|
272
|
+
|Memory Usage
|
|
273
|
+
|High
|
|
274
|
+
|High
|
|
275
|
+
|Similar requirements
|
|
276
|
+
|
|
277
|
+
|Compatibility
|
|
278
|
+
|Wider
|
|
279
|
+
|Limited
|
|
280
|
+
|Use PPMd7 for compatibility
|
|
281
|
+
|
|
282
|
+
|Default in 7-Zip
|
|
283
|
+
|Yes
|
|
284
|
+
|No
|
|
285
|
+
|PPMd7 is standard
|
|
286
|
+
|===
|
|
287
|
+
|
|
288
|
+
**Recommendation**: Use PPMd7 unless you have specific reasons to use PPMd8.
|
|
289
|
+
|
|
290
|
+
== Optimization Tips
|
|
291
|
+
|
|
292
|
+
. **Match Memory to File Size**: Use larger memory for larger files
|
|
293
|
+
. **Higher Order for Repetitive Text**: Increase order for highly structured text
|
|
294
|
+
. **Use Solid Archives**: PPMd benefits greatly from solid compression
|
|
295
|
+
. **Combine with Preprocessing**: Generally not needed for text
|
|
296
|
+
. **Monitor Memory Usage**: Ensure sufficient RAM available
|
|
297
|
+
|
|
298
|
+
== Technical Details
|
|
299
|
+
|
|
300
|
+
**Algorithm Type**: Statistical context modeling
|
|
301
|
+
|
|
302
|
+
**Prediction Method**: Partial Matching with escape codes
|
|
303
|
+
|
|
304
|
+
**Context Length**: Configurable (order parameter)
|
|
305
|
+
|
|
306
|
+
**Memory Model**: Explicit memory size configuration
|
|
307
|
+
|
|
308
|
+
**Compatibility**: Standard PPMd variant H implementation
|
|
309
|
+
|
|
310
|
+
== See Also
|
|
311
|
+
|
|
312
|
+
* link:lzma2.html[LZMA2] - General-purpose alternative
|
|
313
|
+
* link:../../compatibility.html[Compatibility] - PPMd support across tools
|
|
@@ -0,0 +1,296 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Zstandard
|
|
3
|
+
nav_order: 8
|
|
4
|
+
parent: Compression Algorithms
|
|
5
|
+
grand_parent: Guides
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
== Purpose
|
|
9
|
+
|
|
10
|
+
Zstandard (zstd) is a modern, fast compression algorithm developed by Facebook that offers an excellent balance between compression ratio and speed. It significantly outperforms Deflate in both speed and compression ratio.
|
|
11
|
+
|
|
12
|
+
== Key Characteristics
|
|
13
|
+
|
|
14
|
+
[cols="1,3"]
|
|
15
|
+
|===
|
|
16
|
+
|Property |Value
|
|
17
|
+
|
|
18
|
+
|Compression Ratio
|
|
19
|
+
|Very good (better than Deflate)
|
|
20
|
+
|
|
21
|
+
|Compression Speed
|
|
22
|
+
|Very fast (3-4x faster than Deflate)
|
|
23
|
+
|
|
24
|
+
|Decompression Speed
|
|
25
|
+
|Extremely fast (4-5x faster than Deflate)
|
|
26
|
+
|
|
27
|
+
|Memory Usage
|
|
28
|
+
|Low to medium
|
|
29
|
+
|
|
30
|
+
|Best For
|
|
31
|
+
|Real-time compression, high-throughput applications, modern systems
|
|
32
|
+
|===
|
|
33
|
+
|
|
34
|
+
== When to Use Zstandard
|
|
35
|
+
|
|
36
|
+
**Choose Zstandard when**:
|
|
37
|
+
|
|
38
|
+
* Need fast compression with good ratios
|
|
39
|
+
* Real-time compression requirements
|
|
40
|
+
* High throughput is critical
|
|
41
|
+
* Working with modern systems and tools
|
|
42
|
+
* Want better performance than Deflate without LZMA's slowness
|
|
43
|
+
|
|
44
|
+
**Consider alternatives when**:
|
|
45
|
+
|
|
46
|
+
* Maximum compatibility is required (use Deflate)
|
|
47
|
+
* Best compression ratio needed (use LZMA2)
|
|
48
|
+
* Working with legacy systems
|
|
49
|
+
|
|
50
|
+
== Basic Usage
|
|
51
|
+
|
|
52
|
+
=== Compress a File (.zst)
|
|
53
|
+
|
|
54
|
+
[source,ruby]
|
|
55
|
+
----
|
|
56
|
+
# Writes a real Zstandard frame (validated by the system zstd CLI)
|
|
57
|
+
Omnizip.compress_file('logfile.log', 'logfile.log.zst')
|
|
58
|
+
|
|
59
|
+
# Compression level (generic 0-9 scale; values above 9 pass through
|
|
60
|
+
# as native zstd levels 1-22)
|
|
61
|
+
Omnizip.compress_file('data.bin', 'data.bin.zst', level: 9)
|
|
62
|
+
|
|
63
|
+
Omnizip.decompress_file('logfile.log.zst', 'logfile.log')
|
|
64
|
+
----
|
|
65
|
+
|
|
66
|
+
=== Zstandard Entries in ZIP
|
|
67
|
+
|
|
68
|
+
ZIP supports Zstandard as a per-entry method (method 93). Requires a
|
|
69
|
+
modern reader (e.g. 7-Zip 21+):
|
|
70
|
+
|
|
71
|
+
[source,ruby]
|
|
72
|
+
----
|
|
73
|
+
require 'omnizip/zip/output_stream'
|
|
74
|
+
|
|
75
|
+
Omnizip::Zip::OutputStream.open('fast.zip') do |zip|
|
|
76
|
+
zip.put_next_entry('data.bin', compression: :zstandard, level: 3)
|
|
77
|
+
zip.write(data)
|
|
78
|
+
end
|
|
79
|
+
----
|
|
80
|
+
|
|
81
|
+
== Compression Levels
|
|
82
|
+
|
|
83
|
+
Zstandard offers levels 1-22 with fine-grained control:
|
|
84
|
+
|
|
85
|
+
[cols="1,2,2,2"]
|
|
86
|
+
|===
|
|
87
|
+
|Level Range |Speed |Ratio |Typical Use
|
|
88
|
+
|
|
89
|
+
|1-3
|
|
90
|
+
|Very Fast
|
|
91
|
+
|Good
|
|
92
|
+
|Real-time, temporary files
|
|
93
|
+
|
|
94
|
+
|3-7
|
|
95
|
+
|Fast
|
|
96
|
+
|Very Good
|
|
97
|
+
|**Default** - general use
|
|
98
|
+
|
|
99
|
+
|8-15
|
|
100
|
+
|Medium
|
|
101
|
+
|Excellent
|
|
102
|
+
|Distribution, important data
|
|
103
|
+
|
|
104
|
+
|16-22
|
|
105
|
+
|Slow
|
|
106
|
+
|Excellent+
|
|
107
|
+
|Archival (approaches LZMA)
|
|
108
|
+
|===
|
|
109
|
+
|
|
110
|
+
.Level Performance Example
|
|
111
|
+
[source,ruby]
|
|
112
|
+
----
|
|
113
|
+
# Compare different Zstandard levels (native zstd scale)
|
|
114
|
+
[1, 12, 19].each do |level|
|
|
115
|
+
time = Benchmark.measure do
|
|
116
|
+
Omnizip.compress_file('data.bin', "zstd-#{level}.zst", level: level)
|
|
117
|
+
end
|
|
118
|
+
|
|
119
|
+
size = File.size("zstd-#{level}.zst")
|
|
120
|
+
puts "Level #{level}: #{size / 1024} KB in #{time.real.round(3)}s"
|
|
121
|
+
end
|
|
122
|
+
----
|
|
123
|
+
|
|
124
|
+
== Performance Comparison
|
|
125
|
+
|
|
126
|
+
No benchmark tables here: Omnizip's Zstandard is a pure Ruby
|
|
127
|
+
implementation, so absolute throughput differs substantially from
|
|
128
|
+
the C library. The algorithmic trade-offs hold — faster than LZMA
|
|
129
|
+
per level, better ratio than Deflate — but measure on your own
|
|
130
|
+
workloads.
|
|
131
|
+
|
|
132
|
+
== Advanced Features
|
|
133
|
+
|
|
134
|
+
=== Dictionary Compression
|
|
135
|
+
|
|
136
|
+
A raw dictionary (shared prefix) dramatically improves ratios on
|
|
137
|
+
small, repetitive inputs. Dictionary *training* is not implemented;
|
|
138
|
+
prepare dictionary content yourself and load it with +from_raw+:
|
|
139
|
+
|
|
140
|
+
[source,ruby]
|
|
141
|
+
----
|
|
142
|
+
dict = Omnizip::Algorithms::Zstandard::Dictionary.from_raw(
|
|
143
|
+
42, File.binread('shared-samples.bin')
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
zstd = Omnizip::Algorithms::Zstandard.new
|
|
147
|
+
File.open('data.json', 'rb') do |input|
|
|
148
|
+
File.open('data.json.zstd', 'wb') do |output|
|
|
149
|
+
zstd.compress_with_dict(input, output, dict)
|
|
150
|
+
end
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
File.open('data.json.zstd', 'rb') do |input|
|
|
154
|
+
File.open('data.restored', 'wb') do |output|
|
|
155
|
+
zstd.decompress_with_dict(input, output, dict)
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
----
|
|
159
|
+
|
|
160
|
+
=== Streaming
|
|
161
|
+
|
|
162
|
+
The codec is stream-oriented:
|
|
163
|
+
|
|
164
|
+
[source,ruby]
|
|
165
|
+
----
|
|
166
|
+
zstd = Omnizip::AlgorithmRegistry.get(:zstandard).new
|
|
167
|
+
File.open('input.log', 'rb') do |input|
|
|
168
|
+
File.open('input.log.zst', 'wb') do |output|
|
|
169
|
+
zstd.compress(input, output, level: 3)
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
----
|
|
173
|
+
|
|
174
|
+
== Use Cases
|
|
175
|
+
|
|
176
|
+
=== Log File Compression
|
|
177
|
+
|
|
178
|
+
Perfect for compressing logs quickly:
|
|
179
|
+
|
|
180
|
+
[source,ruby]
|
|
181
|
+
----
|
|
182
|
+
# Compress today's logs rapidly
|
|
183
|
+
Dir.glob('/var/log/app/*.log').each do |log|
|
|
184
|
+
Omnizip.compress_file(log, "#{log}.zst", level: 3)
|
|
185
|
+
end
|
|
186
|
+
----
|
|
187
|
+
|
|
188
|
+
=== Web Application Responses
|
|
189
|
+
|
|
190
|
+
Compress API responses on-the-fly:
|
|
191
|
+
|
|
192
|
+
[source,ruby]
|
|
193
|
+
----
|
|
194
|
+
require 'stringio'
|
|
195
|
+
|
|
196
|
+
class ExportController < ApplicationController
|
|
197
|
+
def download
|
|
198
|
+
data = generate_export_data # a String
|
|
199
|
+
|
|
200
|
+
zstd = Omnizip::AlgorithmRegistry.get(:zstandard).new
|
|
201
|
+
output = StringIO.new
|
|
202
|
+
zstd.compress(StringIO.new(data), output, level: 3)
|
|
203
|
+
|
|
204
|
+
send_data output.string,
|
|
205
|
+
filename: 'export.zst',
|
|
206
|
+
type: 'application/zstd'
|
|
207
|
+
end
|
|
208
|
+
end
|
|
209
|
+
----
|
|
210
|
+
|
|
211
|
+
=== Database Dumps
|
|
212
|
+
|
|
213
|
+
Stream a dump into a .zst frame:
|
|
214
|
+
|
|
215
|
+
[source,ruby]
|
|
216
|
+
----
|
|
217
|
+
# Stream database dump to compressed file
|
|
218
|
+
require 'open3'
|
|
219
|
+
|
|
220
|
+
zstd = Omnizip::AlgorithmRegistry.get(:zstandard).new
|
|
221
|
+
File.open('db-backup.sql.zst', 'wb') do |output|
|
|
222
|
+
# Stream pg_dump output directly
|
|
223
|
+
Open3.popen3('pg_dump mydb') do |_stdin, stdout, _stderr, _wait_thr|
|
|
224
|
+
zstd.compress(stdout, output, level: 7)
|
|
225
|
+
end
|
|
226
|
+
end
|
|
227
|
+
----
|
|
228
|
+
|
|
229
|
+
== Memory Efficiency
|
|
230
|
+
|
|
231
|
+
Zstandard is memory efficient:
|
|
232
|
+
|
|
233
|
+
[cols="1,1,1"]
|
|
234
|
+
|===
|
|
235
|
+
|Level |Compression RAM |Decompression RAM
|
|
236
|
+
|
|
237
|
+
|1-3
|
|
238
|
+
|~1 MB
|
|
239
|
+
|<1 MB
|
|
240
|
+
|
|
241
|
+
|4-7
|
|
242
|
+
|~8 MB
|
|
243
|
+
|<1 MB
|
|
244
|
+
|
|
245
|
+
|8-15
|
|
246
|
+
|~30 MB
|
|
247
|
+
|<1 MB
|
|
248
|
+
|
|
249
|
+
|16-22
|
|
250
|
+
|~100 MB
|
|
251
|
+
|<1 MB
|
|
252
|
+
|===
|
|
253
|
+
|
|
254
|
+
*Note: Decompression always requires minimal memory*
|
|
255
|
+
|
|
256
|
+
== Best Practices
|
|
257
|
+
|
|
258
|
+
. **Use Level 3-5 for General Use**: Excellent speed/ratio balance
|
|
259
|
+
. **Level 1 for Real-Time**: When speed is critical
|
|
260
|
+
. **Level 10+ for Archival**: When time permits better compression
|
|
261
|
+
. **Train Dictionaries**: For repetitive data types (JSON, logs)
|
|
262
|
+
. **Monitor Performance**: Should achieve 50-200 MB/s compression
|
|
263
|
+
|
|
264
|
+
== Command-Line Usage
|
|
265
|
+
|
|
266
|
+
[source,bash]
|
|
267
|
+
----
|
|
268
|
+
$ omnizip compress data.bin data.bin.zst --algorithm zstandard
|
|
269
|
+
|
|
270
|
+
# The output is a standard Zstandard frame, readable by the system
|
|
271
|
+
# zstd CLI
|
|
272
|
+
----
|
|
273
|
+
|
|
274
|
+
== Technical Details
|
|
275
|
+
|
|
276
|
+
**Zstandard Features**:
|
|
277
|
+
|
|
278
|
+
* **Fast Entropy Encoding**: Finite State Entropy (FSE)
|
|
279
|
+
* **Adaptive Window**: Dynamically sized based on level
|
|
280
|
+
* **Dictionary Compression**: Raw-dictionary priming (entropy-table
|
|
281
|
+
preloading from RFC dictionaries is not implemented)
|
|
282
|
+
* **Frames**: Interoperable with the reference zstd CLI (verified
|
|
283
|
+
both directions)
|
|
284
|
+
|
|
285
|
+
**Implementation**: Pure Ruby, part of Omnizip. No native binding.
|
|
286
|
+
|
|
287
|
+
**Not available**: Zstandard is not offered as a 7z coder method;
|
|
288
|
+
in 7z archives use LZMA2/PPMd/BZip2. Multi-threading is not
|
|
289
|
+
implemented (single-threaded encoder).
|
|
290
|
+
|
|
291
|
+
== See Also
|
|
292
|
+
|
|
293
|
+
* link:deflate.html[Deflate] - Traditional fast compression
|
|
294
|
+
* link:lzma2.html[LZMA2] - Better ratio, slower speed
|
|
295
|
+
* link:../advanced-features/streaming.html[Streaming] - Zstandard excels at streaming
|
|
296
|
+
* link:../performance-tuning.html[Performance Tuning] - Optimize for speed
|