这里的问题是,当你调用emails.each时,ActiveRecord会加载数据库中的所有记录并将它们保存在内存中,为避免这种情况,你可以使用方法
find_each:
require 'csv'
BATCH_SIZE = 5000
def write_rows(emails)
CSV.open(file_path, 'w') do |csv|
csv << %w{email name ip created}
emails.find_each do |email|
csv << [email.email, email.name, email.ip, email.created_at]
end
end
end
默认情况下,find_each一次加载1000个批次的记录,如果要加载5000个记录的批次,则必须通过以下选项:batch_size to find_each:
emails.find_each(:batch_size => 5000) do |email|
...
有关find_each方法(以及相关的find_in_batches)的更多信息,请参见Ruby on Rails Guides.
我已经使用CSV类来编写文件,而不是手动连接字段和行.这并不是性能优化,因为在文件上写入不应该是这里的瓶颈.