class ExternalSortModule::ChunkWriter

Chunk subclass that performs streaming writing to target with sliding window

Public Class Methods

new(target_file, target_offset, target_length, element_size, chunk_size = MAX_CHUNK_SIZE_) click to toggle source
Calls superclass method ExternalSortModule::Chunk::new
# File lib/geotree/externalsort.rb, line 146
def initialize(target_file, target_offset, target_length, element_size, chunk_size = MAX_CHUNK_SIZE_)
  super(target_file,target_offset,target_length,element_size, chunk_size)
end

Public Instance Methods

write(src_buffer, src_offset = 0) click to toggle source

Write an element to the target @param src_buffer source of element @param src_offset offset into source

# File lib/geotree/externalsort.rb, line 154
def write(src_buffer, src_offset = 0)
  raise IllegalStateException if done
  raise ArgumentError if (src_buffer.size - src_offset < @element_size)

  if @buffer_offset == @buffer.length
    max_size = @max_chunk_size
    chunk_size = [@target_end_offset - @target_offset, max_size].min
    @buffer = zero_bytes(chunk_size)
    @buffer_offset = 0
  end

  @buffer[@buffer_offset,@element_size] = src_buffer[src_offset,@element_size]
  @buffer_offset += @element_size

  # If buffer is now full, flush to target
  if @buffer_offset == @buffer.size
    f = @target_file
    f.pos = @target_offset
    bytes_written = f.write(@buffer)
    raise IOError if @buffer.size != bytes_written
    @target_offset += bytes_written
  end
end