Kun*_*ist 5 ruby rubygems ruby-on-rails-4
要求就像
我们从数据库中获取了庞大的数据集(> 10 亿条记录),需要将其导出到 csv 文件或 excel。
当前实现使用 CSV 类 CSV.generate
CSV.generate(headers: true) do |csv|
csv << header
@obj.find_each do |c|
arr = [c.id,c.name,soon]
csv << array
end
end
Run Code Online (Sandbox Code Playgroud)
并将输出发送到
Zip::File.open(file, Zip::File::CREATE) do |zip|
zip.get_output_stream("test.#{@format}") { |f| f.puts(convert_to_csv) }
end
Run Code Online (Sandbox Code Playgroud)
所有这些操作都是由其他延迟作业完成的。当记录小于 20,000 时,这很有效,但是当行开始增长时,它会出现一些内存问题。
我在想的是将记录分块,比如将 100 万行分成 50 个文件 (1百万/20000)(csv1.csv,csv2.csv,csv3.csv,csv4.csv,csv5.csv),然后将它们合并成一个文件或将所有文件压缩在一起(更快的方式)
任何人都可以让我知道我该如何开始。
查看 CSV.generate 的源代码给我的印象是,在累积内容的同时,csv 数据保存在内存中。这似乎是一个很好的优化目标,特别是当您看到内存随数据集线性扩展时。由于您的数据非常简单,您可以跳过 CSV 并直接转到文件吗?您可以更好地控制何时将数据刷新到磁盘。
File.open("my.csv") do |file|
file.puts '"ID","Name","Soon"'
@obj.find_each do |c|
file.puts "\"#{c.id}\",\"#{c.name}\",\"#{c.soon}\""
# flush if necessary
end
end
Run Code Online (Sandbox Code Playgroud)
您需要写入磁盘,然后使用此方法压缩结果。
| 归档时间: |
|
| 查看次数: |
1243 次 |
| 最近记录: |