Ruby on rails ActiveRecord批量创建的内存权衡

Ruby on rails ActiveRecord批量创建的内存权衡,ruby-on-rails,ruby,postgresql,memory,activerecord,Ruby On Rails,Ruby,Postgresql,Memory,Activerecord,运行PSQL9、Ruby 2.4和Rails 5.x 内存方面,哪种代码更好 object_with_huge_texts.each do |x| MyModel.create(text_col: x.huge_text) end 对 values = Array.new object_with_huge_texts.each do |x| values.push("(" << x.huge_text << ")") end ActiveRecord::Base

运行PSQL9、Ruby 2.4和Rails 5.x

内存方面,哪种代码更好

object_with_huge_texts.each do |x|
  MyModel.create(text_col: x.huge_text)
end

values = Array.new
object_with_huge_texts.each do |x|
  values.push("(" << x.huge_text << ")")
end
ActiveRecord::Base.connection.execute(
 "INSERT INTO my_model (text_col) VALUES '#{values.join(",")}'"
)
values=Array.new
对象_带有_巨大的_文本。每个都有| x|
values.push(“(”这取决于数据的“巨大程度”。我使用过内存大于1TB的服务器,甚至节省了5美元/月。在大多数情况下,VPS的容量仍然大于1GB,所以都是相对的

第一个版本得益于垃圾收集,因为每个模型都是由Ruby创建的,Ruby可以丢弃数据,但是模型本身有额外的开销

第二个版本要求组合一个可能很大的SQL字符串,然后一次将其全部粉碎。这可能是有问题的,原因有两个:您的Ruby内存占用可能太大,或者您的数据库可能会因为查询太大而拒绝查询。Postgres默认的“最大查询大小”通常为1GB


如果您定期进行大容量加载,并且需要提高效率,您可以尝试使用带有占位符值的预处理语句,然后在执行时提供不同的值。只要数据上没有太大的索引压力,这种方法的扩展性非常好,性能通常与多插入式操作相当。

Use
[]
优先于
数组。新的
因为它不太详细。显式初始值设定项只需要预先调整数组的大小或预先填充数组。对于上下文,这是一个zip导入。对于上下文,这是一个zip导入。每个文本大约10kb10KB,这些天来基本上什么都没有。是的,我正在用千字节导入zip文件10kb文本文件的ds。~50mb压缩。。这是我关心的问题,但我遵循了你的建议,让我们看看它是如何进行的