【发布时间】:2019-10-15 03:58:49
【问题描述】:
需求是这样的
我们从数据库中获取庞大的数据集(> 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
并将输出发送到
Zip::File.open(file, Zip::File::CREATE) do |zip|
zip.get_output_stream("test.#{@format}") { |f| f.puts(convert_to_csv) }
end
所有这些操作都是由其他延迟的工作完成的 这在记录
我的想法是将记录分块,例如将 100 万行分成 50 个文件 (100 万/20000)(csv1.csv,csv2.csv,csv3.csv,csv4.csv,csv5.csv),然后 concat将它们放入单个文件或将所有文件压缩在一起(更快)
谁能告诉我如何开始。
【问题讨论】:
-
请问csv数据会在哪里使用?因为我认为 Excel 最多支持 100 万行,请参阅 stackoverflow.com/questions/23757991/…。对于这么多数据,您最好使用某种数据库转储格式。
-
在这种情况下,我首先要考虑的事情之一是消除不必要的 ORM 开销并使用对 DB 的较低级别的查询——实例化数十亿个 AR 实体并没有太大意义从中获取 3 个属性 - 使用原始数据集将减少内存使用并显着提高性能...
-
旁注:
1million/20000是 50,而不是 5 顺便说一句。另外,SELECT INTO OUTFILE. -
@AlekseiMatiushkin 不知道这个功能,谢谢!类似的,但对于 postgres stackoverflow.com/questions/1517635/…
标签: ruby ruby-on-rails-4 rubygems