Class: Omnizip::Algorithms::LZMA2::ChunkManager
- Inherits:
-
Object
- Object
- Omnizip::Algorithms::LZMA2::ChunkManager
- Includes:
- Constants
- Defined in:
- lib/omnizip/algorithms/lzma2/chunk_manager.rb
Overview
LZMA2 Chunk Manager - handles chunk boundaries and decisions
This class is responsible for:
- Splitting data into chunks of appropriate size
- Deciding whether to compress or store each chunk uncompressed
- Managing chunk buffering
- Providing thread safety infrastructure (for future use)
The chunk manager implements intelligent compression decisions based on compression ratio thresholds.
IMPORTANT: LZMA2 format limits uncompressed chunk size to 65536 bytes due to 2-byte size encoding. This manager enforces that limit.
Defined Under Namespace
Classes: Chunk
Constant Summary collapse
- MAX_CHUNK_BYTES =
Maximum bytes per chunk (LZMA2 spec limit)
UNCOMPRESSED_SIZE_MAX + 1
Instance Attribute Summary collapse
-
#chunk_size ⇒ Object
readonly
Returns the value of attribute chunk_size.
Instance Method Summary collapse
-
#create_chunks(data) ⇒ Array<Chunk>
Split data into chunks.
-
#initialize(chunk_size = CHUNK_SIZE_DEFAULT) ⇒ ChunkManager
constructor
Initialize chunk manager.
-
#last_chunk?(chunk_index, total_chunks) ⇒ Boolean
Decide if chunk is last chunk.
-
#optimal_chunk_size(data_size) ⇒ Integer
Calculate optimal chunk size for data.
-
#should_compress?(chunk) ⇒ Boolean
Decide if chunk should be compressed.
Constructor Details
#initialize(chunk_size = CHUNK_SIZE_DEFAULT) ⇒ ChunkManager
Initialize chunk manager
96 97 98 99 100 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 96 def initialize(chunk_size = CHUNK_SIZE_DEFAULT) @chunk_size = validate_chunk_size(chunk_size) # Enforce LZMA2 format limit @effective_chunk_size = [@chunk_size, MAX_CHUNK_BYTES].min end |
Instance Attribute Details
#chunk_size ⇒ Object (readonly)
Returns the value of attribute chunk_size.
42 43 44 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 42 def chunk_size @chunk_size end |
Instance Method Details
#create_chunks(data) ⇒ Array<Chunk>
Split data into chunks
106 107 108 109 110 111 112 113 114 115 116 117 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 106 def create_chunks(data) chunks = [] pos = 0 while pos < data.bytesize chunk_data = data.byteslice(pos, @effective_chunk_size) chunks << Chunk.new(chunk_data) pos += @effective_chunk_size end chunks end |
#last_chunk?(chunk_index, total_chunks) ⇒ Boolean
Decide if chunk is last chunk
142 143 144 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 142 def last_chunk?(chunk_index, total_chunks) chunk_index == total_chunks - 1 end |
#optimal_chunk_size(data_size) ⇒ Integer
Calculate optimal chunk size for data
This method can be used to dynamically adjust chunk size based on data characteristics (future enhancement).
153 154 155 156 157 158 159 160 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 153 def optimal_chunk_size(data_size) # For now, use effective chunk size # Future: could adjust based on data size return @effective_chunk_size if data_size <= @effective_chunk_size * 2 # For larger data, might want larger chunks (up to max) [@effective_chunk_size * 2, MAX_CHUNK_BYTES].min end |
#should_compress?(chunk) ⇒ Boolean
Decide if chunk should be compressed
Makes decision based on compression ratio threshold. If compressed size is not significantly smaller than uncompressed size, store uncompressed.
127 128 129 130 131 132 133 134 135 |
# File 'lib/omnizip/algorithms/lzma2/chunk_manager.rb', line 127 def should_compress?(chunk) return false unless chunk.compressed_data # Calculate compression ratio ratio = chunk.output_size.to_f / chunk.uncompressed_size # Only use compression if ratio is below threshold ratio < COMPRESSION_THRESHOLD end |