rails csv import ram consumption issue postgres

时间:2016-08-19 14:15:25

标签: ruby-on-rails postgresql csv memory-leaks

我在rails应用中实现了CSV导入。现在的问题是公羊消费过高。总数没有。我的CSV中的记录大约是3600,而我的内存消耗大约为600MB - 800MB,并且在退出导入方法后甚至没有刷新。

我可以在roo问题列表https://github.com/roo-rb/roo/issues/179

中看到类似的问题

我正在努力 Rails 4.2.6 Ruby 2.2.4

代码:

data = CSV.foreach(file.path, headers: true)

data.each do |row|

    Model.create(row ....)

    .........

end

最初我的公羊消费是:

GetProcessMem:0x7fd3083b2a30 @mb=204.52734375

在退出方法之前:

GetProcessMem:0x7fd30ae1a7a0 @mb=289.60546875

完成并重定向到主页后:

GetProcessMem:0x7fd2fb3913d8 @mb=629.61328125

有了这么多内存消耗,我无法在heroku上部署它。 这个消耗的内存甚至无法清理,必须重启我的服务器。

任何人都有解决方案或任何其他方式导入csv。

1 个答案:

答案 0 :(得分:1)

使用此gem smarter_csv并使用批处理过程。这样可以将导入分组并降低操作所需的ram数量

实施例。 500行组

    SmarterCSV.process(file, {chunk_size: 500 }) do |array|
      array.each do |sub_array|
        if User.find_by_order_id(sub_array[:order_id]).present?
          User.update_attribute :shipping_id, sub_array[:order_id]
        end
      end
    end