我想在 rake 任务中将我的销售数据导出到 CSV 文件。销售表大约有 1 亿个条目。我该如何优化此代码?它运行的时间越长,速度似乎就越慢。
sales = Sales.where(year: 2024)
BATCH_SIZE = 10_000
header_names = %w[user_id article_id amount currency date]
batch = []
File.open(filepath, 'w') do |file|
sales.find_each(batch_size: BATCH_SIZE)do |sale|
batch << sale.slice(*header_names).values.join(';')
if batch.size >= BATCH_SIZE
file.puts batch.join("\n")
batch.clear
end
end
file.puts batch.join("\n") unless batch.empty?
end
这花了我大约 23 分钟来导出 1700 万个条目。
最好使用原始 SQL(PostgreSQL 示例)而不是 Ruby
速度更快
基本思想
在这种情况下,你不会启动 Active Record 对象
数据直接写入文件,而不是构建大型内存数组
对于自定义分隔符
如果你能直接访问数据库,最好最快的方法是使用
COPY
数据库提供的命令。以 PostgreSQL 的COPY为例:如果您不能直接访问数据库或者更喜欢使用 Ruby 代码,则可以通过以下方式改进: