Instantly share code, notes, and snippets.

Embed
What would you like to do?
LIMIT_FILESIZE = 1000000000 # COPYの推奨サイズ
def post_initialize(_args)
@nodes = ENV['nodes'] || 4
my_conf
remove_files
end
def call
TABLES.each do |table|
# system "mysql --defaults-file=#{conf_file_path} -h\"#{host}\" -D \"#{database}\" -e \"select * from #{table} where updated_at >= \'#{1.week.ago.strftime('%Y/%m/%d 00:00:00')}\'\" -s -N > #{outputs_dir}/#{table}.txt"
system "mysql --defaults-file=#{conf_file_path} -h\"#{host}\" -D \"#{database}\" -e \"select * from #{table}\" -s -N > #{outputs_dir}/#{table}.txt"
file_size = File.size("#{outputs_dir}/#{table}.txt")
rows = `wc -l #{outputs_dir}/#{table}.txt`.match(/\s*(\d*)/)[1].to_i
@file_count = file_count(file_size)
if os == :macosx
# MAC OSでは、`-d`オプションが利用できない。使いたい場合は、brew install coreutils
system "gsplit -d -l #{(rows / @file_count) + @nodes} #{outputs_dir}/#{table}.txt #{splits_dir}/#{table}.txt. &>/dev/null"
else
system "split -d -l #{(rows / @file_count) + @nodes} #{outputs_dir}/#{table}.txt #{splits_dir}/#{table}.txt. &>/dev/null"
end
files = Pathname.glob(splits_dir.join("#{table}*"))
end
remove_my_conf
end
def file_count(file_size)
return 1 if file_size < LIMIT_FILESIZE
@nodes.step(Float::INFINITY, @nodes) do |i|
next if (file_size / i) > LIMIT_FILESIZE
return i
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment