write_string =
File.open(txt1) do |f|
f.readlines.map { |line| line.scan(/.{1,4}/) }.join(' ')
end
File.open('out1.txt', 'a') do |f|
f.write(write_string)
end
Мы можем отсканировать каждую строку с помощью регулярного выражения, чтобы разбить строку на группы по 4. Тогда нам нужно только одно объединение вне карты, чтобы сконцентрировать все в одну строку из групп из 4 символов.
Я думаю, что открытие и запись в файл каждого символа является источником замедления.Теперь у нас есть одна запись для всего файла.
РЕДАКТИРОВАТЬ: Протестировал идею сканирования против gsub из комментариев.
file_name = 'test_file.txt'
File.open(file_name, 'a') { |f| f.puts(('a' * 200 * 1000).scan(/.{200}/)) }
Дает нам файл из 1000 строк, состоящий из 200 (50 * 4) символов в строке.Я использовал сканирование при создании файла, но это не часть теста!:)
Benchmark.bmbm do |x|
x.report(:scan) do
File.open(file_name) do |f|
f.readlines.map { |line| line.scan(/.{1,4}/) }.join(' ')
end
end
x.report(:gsub) do
File.open(file_name) do |f|
f.readlines.map { |line| line.gsub(/(.{4})(?=\S)/, "\\1 ") }.join(' ')
end
end
end
user system total real
scan 0.020217 0.000273 0.020490 ( 0.020522)
gsub 0.035371 0.000603 0.035974 ( 0.035975)
scan 0.020094 0.000164 0.020258 ( 0.020275)
gsub 0.034890 0.000528 0.035418 ( 0.035442)
Похоже, сканирование примерно на 43% быстрее.