我在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。
答案 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