【问题标题】:downloaded CSV reports overloading servers, how can I grab thousands of records efficiently?下载的 CSV 报告服务器超载,如何有效地抓取数千条记录?
【发布时间】:2016-10-28 16:58:55
【问题描述】:

假设我有一个页面,可让您下载您的用户帐户 cmets 的 CSV 报告,其中可能包含数千条记录。有没有更快的方法来遍历每个用户的 cmets?现在我只是在做一个简单的循环。

@user.comments.each do comment
 # create csv
end

【问题讨论】:

  • 将数据存储在数据库而不是 csv 文件中会是一个好的开始。
  • @DanBracuk 它在数据库中。您可以在页面中将该数据下载到 CSV 文件中。
  • 您正在使用哪个DBMS。在SQL SERVER 我们可以BCP 实用程序来生成CSV。它非常高效,您不必遍历每条记录
  • @Prdp 使用 mysql2
  • 我同意 @Prdp stackoverflow.com/questions/467452/… 执行原始 SQL 查询以一次性转储 CSV!

标签: sql ruby-on-rails activerecord orm


【解决方案1】:

在 DB 特定查询之外直接转储到 CSV,并且假设您真的只是一次转储单个用户的 cmets,我会使用 pluck 来避免实例化所有这些 AR 对象的开销。这也意味着您可以将返回的列限制为只返回真正需要导出的列。

@user.comments.pluck(:id, :body).each do |comment|
  # add to csv here
end

【讨论】:

    【解决方案2】:

    类似:

    require 'csv'
    sql = "Select * from comments"
    records = ActiveRecord::Base.connection.execute(sql)
    CSV.open("path/to/file.csv", "wb") do |csv|
      records.each do |rec|
        csv << rec
      end
    end
    

    应该比为每行创建一个 AR 对象快几个数量级。没有测试过这段代码,但你明白了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      相关资源
      最近更新 更多