一种的生成 csv 文件的做法:
csv = ''
@customers.each do |customer|
csv = "#{csv}#{customer.id},#{.......}\n"
end
return csv
这种做法存在性能问题,特别是 customers 达到 1 万条以上,并且每一行内容比较长的时候。 原因是 csv 这个字符串变量太大了(达到 1M),再往 csv 的末尾追加内容会比较吃力,这种情况,生成 csv 最终结果要 1 分钟。
解决的办法:
csv = []
@customers.each do |customer|
csv << "#{customer.id},#{.......}"
end
return csv.join("\n")
csv 从字符串变成了 Array, 避免了超大 String 的可能。和上述同样场景下,生成 csv 最终结果只要 5 秒。