Ruby gsub,NoMemoryError:无法分配内存。

时间:2016-02-25 12:51:39

标签: ruby-on-rails ruby out-of-memory

我们有一个缓存的html模板 - 它有占位符值。基于实际对象值,占位符正在被替换。这种方法效果很好,但有时会导致错误(无法分配内存)。

    replacement_hash.keys.each do |placeholder|
      value = ##some logic to get values from model using placeholder text.
      text.gsub!(placeholder, value)
    end

有关如何修复(提高效率)或任何其他方法的建议吗?

由于

1 个答案:

答案 0 :(得分:1)

这是由于糟糕的用户数据 - 包含无效值的字符串 - 导致gsub无法正常工作,并且将被gsub替换的相同字符串再次插回。

代码有一个递归函数,它将继续替换,直到没有[[xxx]]字符串存在 - 这导致代码进入循环直到内存已满。

"Kiprosh [[signature]]".gsub("[[signature]]", "\0 and \0")
expected =>  "Kiprosh \0 and \0"
actual   => "Kiprosh [[signature]] and [[signature]]"