Слишком медленный скрипт на Ruby - PullRequest
0 голосов
/ 13 декабря 2018

Что ж, первое, что я делаю, это извлекаю шестнадцатеричные числа из файла, и я записываю их в формате .txt (это занимает менее 1 секунды), затем я передаю этот сценарий, чтобы разделить их на группы по 4 шестнадцатеричных числа:

txt1 = 'HEX.txt'

count = 0
File.foreach(txt1).with_index do |line| 
    line.each_char do |hex|
        count += 1
        File.open('out1.txt', 'a') do |f|
            f.write(hex)
            if count == 4
                f.write(' ')
                count = 0
            end           
        end
    end
end

Но это занимает слишком много времени, так как .txt с шестнадцатеричным значением весит всего 13 МБ, поэтому я думаю, что этот скрипт очень плохой, как я могу его улучшить?

1 Ответ

0 голосов
/ 13 декабря 2018
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% быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...