gpt4 book ai didi

ruby-on-rails - 大型 Rails 后台进程未完成的问题

转载 作者:可可西里 更新时间:2023-11-01 11:23:46 26 4
gpt4 key购买 nike

我有一个 Rails 后台进程(使用 Sidekiq 和 Redis)来解析 XML 文件并稍后对其进行修改。

后台进程按预期运行,但在 XML 非常大时仍处于处理状态并且不会完成。我对此的两个假设是:

  1. 我的后台进程正在将 XML 中的大量文本存储到数组 old_textsnew_texts 中,这导致了问题
  2. 我的后台进程超时

问题出现在我的开发机器(& staging)上。

我不确定如何调试这个问题。我不认为发布我的代码会有帮助,但如果您需要了解我在做什么,我会这样做:

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

最佳答案

我最终重构了我的代码,以管理最初将被插入数组的每个元素。没有加快速度,但至少后台任务在几个小时后完成。

关于ruby-on-rails - 大型 Rails 后台进程未完成的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55073285/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com