Проблема с большим рельсовым фоновым процессом не завершена - PullRequest
0 голосов
/ 09 марта 2019

У меня есть фоновый процесс rails (с использованием Sidekiq и Redis), который анализирует XML-файлы и позже вносит в него изменения.

Фоновый процесс работает как задумано, но остается в обработке и не завершается, когда XML действительно большой. Мои два предположения для этого:

  1. Мой фоновый процесс хранит большие массивы текста из XML в массивах old_texts & new_texts и вызывает проблемы
  2. Мой фоновый процесс истекает

Проблема возникает как на моей машине для разработки (так и на стадии разработки).

Я не уверен, как отладить эту проблему. Я не думаю, что размещение моего кода поможет, но я сделаю это, если вам понадобится представление о том, что я делаю:

old_texts, new_texts = [], []

xml_no_includs = ["pctHeight","pctWidth","posOffset","delText","delInstrText","instrText"]    

search = '//w:document//w:body//w:p'

ancestors_excluds = ['//mc:Fallback', '//w:tbl', '//wps:txbx', '//v:textbox']

old_texts, new_texts = get_texts(old_texts, new_texts, XML, xml_no_includs, ancestors_excluds, search)

search_param = '//w:document//w:body//w:p'

ancestors_excluds = ['//mc:Fallback', '//w:tbl', '//wps:txbx', '//v:textbox']

replace_texts(old_texts, new_texts, XML, search_param, ancestors_excluds)

-

def replace_texts(old_texts, new_texts, XML, search_param, ancestors_excluds)
  text_params = './/text()[not(ancestor::wp14:pctHeight or ancestor::wp14:pctWidth or ancestor::wp:posOffset or ancestor::w:instrText or ancestor::w:delText or ancestor::w:delInstrText)]'
  inc = 0

  old_texts.each_with_index do |old_text, index|
    accum_string = ''
    double_break = false
    XML.search(search_param).drop(inc).each do |line|
      inc += 1
      temp = true
        line.search(text_params).each do |p|
          temp2 = true
          ancestors_excluds.each do |param|
            temp2 = false if p.ancestors(param).present? 
          end
          if temp2 == true
            if accum_string.blank? && !p.content.blank?
              accum_string += p.content
              p.content = new_texts[index]
            else
              accum_string += p.content unless accum_string.blank?
              p.content = ''
            end
            if accum_string.strip == old_text.strip            
              double_break = true
              break
            end
          end
        end    
      break if double_break == true
    end
  end
end

-

def get_texts(old_texts, new_texts, XML, xml_no_includs, ancestors_excluds, search_param)
  XML.xpath(search_param).each do |p|
    text = ''
    temp = true
    p.search('text()').each do |p2|
      temp2 = true
      temp2 = false if xml_no_includs.include?(p2.parent.name)
      ancestors_excluds.each do |param|
        temp2 = false if p2.ancestors(param).present? 
      end
      text += p2.text if temp2 == true
    end
    unless text.blank?
      old_texts.append(text) 
      new_texts.append(text.gsub(/(.)./, '\1*') )
    end
  end
  old_texts.reject!(&:blank?)
  new_texts.reject!(&:blank?)

  return old_texts, new_texts
end

1 Ответ

0 голосов
/ 09 марта 2019

Я закончил рефакторинг своего кода для управления каждым элементом, который изначально собирался поместить в массив.Не ускорил его больше, но, по крайней мере, фоновая задача завершается через несколько часов.

...