在 Ruby on rails 中为 1 亿条记录生成 CSV/Excel 文件?

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),然后将它们合并成一个文件或将所有文件压缩在一起(更快的方式)

任何人都可以让我知道我该如何开始。

And*_*dyV 2

查看 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)

您需要写入磁盘,然后使用此方法压缩结果。