运行Psql 9,Ruby 2.4和Rails 5.x
记忆明智,哪种代码更好?
FlatList
与
object_with_huge_texts.each do |x|
MyModel.create(text_col: x.huge_text)
end
据我所知,第二个选项是1 sql query vs n + 1。
但巨型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(",")}'"
)
数组会导致内存膨胀吗?
答案 0 :(得分:1)
这取决于这些数据的“巨大”程度。我使用的服务器内存大于1TB,甚至节省了5美元/小时。在大多数情况下,VPS仍然具有> 1GB,因此它们都是相对的。
第一个版本受益于垃圾收集,因为每个模型都是创建的,Ruby可以丢弃数据,但模型本身会有额外的开销。
第二个版本需要编写一个可能很大的SQL字符串并立即将其粉碎。这可能有问题,原因有二:您的Ruby内存占用空间可能太大,或者您的数据库可能会拒绝查询太大。 Postgres默认的“最大查询大小”通常为1GB。
如果您定期进行批量加载并且需要高效加载,则可以尝试使用带有占位符值的预准备语句,然后在执行时提供不同的值。这样可以很好地扩展,只要数据上没有很多索引压力,性能通常可以与多插入式操作相媲美。