Sha256: 8fa8a0a3186c77c081b33ada180a5cb66ef333edcbbd0605be65afcb4f229ab1
Contents?: true
Size: 1.82 KB
Versions: 24
Compression:
Stored size: 1.82 KB
Contents
module EY module Backup class Splitter include Spawner include Logging CHUNK_SIZE = 1024 * 64 MAX_FILE_SIZE = (4.5*1024*1024*1024).to_i #4.5GB def self.dump(file, split_size) split_size ||= MAX_FILE_SIZE new.dump(file, split_size) end def self.load(files) new.load(files) end def load(files) if files.size > 1 join(files) else files.first end end def dump(file, split_size) if File.size(file) >= split_size split(file, split_size) else [file] end end def join(input_files) filename = input_files.first.sub(/\.part\d+$/, '') File.open(filename, 'w') do |output| sort(input_files).each do |input| File.open(input, 'r') do |i| while chunk = i.read(CHUNK_SIZE) output << chunk end end end end filename end def sort(input_files) input_files.sort {|a,b| part_number(a) <=> part_number(b) } end def part_number(file) file[/\.part(\d+)/, 1].to_i end def split(file, split_size) total_size, part = 0, 0 files = [] File.open(file, 'r') do |i| until total_size == File.size(file) part += 1 part_size = 0 filename = "#{file}.part#{part}" File.open(filename, 'w') do |o| while part_size < split_size && (chunk = i.read([split_size - part_size, CHUNK_SIZE].min)) part_size += chunk.size o << chunk end end total_size += part_size files << filename end end files end end end end
Version data entries
24 entries across 24 versions & 1 rubygems