7. Work Flow
1. mysqldump with -default-character-
set=latin1 parameter to generate SQL file.
2. Transcoding SQL file with tool like iconv/
bsdconv.
3. Edit transcoded SQL file to avoid 「slash」
problem.
4. Restore SQL file to new DB.
12年12月8⽇日星期六
19. DBNAME = 'wwwfsc'
CORES_COUNT = 4
ForceEncoding = 'Big5-UAO'
LIMIT = ARGV[0].to_i || 10000
OUT = '/dev/null'
sqls = CORES_COUNT.times.map do |x|
sprintf("SELECT * FROM cdb_posts ORDER BY pid LIMIT %d OFFSET %d;", LIMIT, (x
* LIMIT))
end
class String
def to_my_val
"'#{Mysql2::Client.escape
self.force_encoding(ForceEncoding).encode('UTF-8', :invalid => :replace, :undef
=> :replace, :replace => '??')}'"
end
end
procs = sqls.map do |sql|
Proc.new do |out|
open(out,'w') do |io|
Mysql2::Client.new(database: DBNAME, reconnect: true, encoding:
'latin1').query(sql).each(as: :array) do |row|
io.print "INSERT INTO `cdb_posts` VALUES
(#{row.map(&:to_my_val).join(',')});n"
end
end
end
end
12年12月8⽇日星期六
20. Benchmark.bm(15) do |x|
x.report("Thread"){procs.map{|p| Thread.new{p.call(OUT)} }.each(&:join)}
x.report("Fork"){procs.each{|p| fork{p.call(OUT)} }; Process.waitall}
x.report("Normal"){procs.each{|p| p.call(OUT)}}
end
12年12月8⽇日星期六
40. procs = sql_raws.map do |arr|
proc do
io = Tempfile.new(SecureRandom.uuid)#open('/dev/null','w')
puts io.path
io.write "INSERT INTO `cdb_posts` VALUES "
io.write arr.join(',')
io.write "n"
io.close
end
end
12年12月8⽇日星期六
43. procs = sqls.map do |sql|
Proc.new do
io = Tempfile.new(SecureRandom.uuid)
Mysql2::Client.new(database: DBNAME, reconnect: true, encoding:
'latin1').query(sql).each(as: :array) do |row|
io.write "INSERT INTO `cdb_posts` VALUES
(#{row.map(&:to_my_val).join(',')});n"
end
io.close
end
end
12年12月8⽇日星期六
45. Conclusion
Thread fork normal
MySQL2-read Fast Fast x
Transcoding &
Slow Very fast x
iteration
Write to the
Very slow Slow Fast
same I/O
Write to the
Fast Slow Fast
different I/O
12年12月8⽇日星期六
46. There is no effective
and 「all-around」
concurrency model.
12年12月8⽇日星期六