Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 发现每个批次之间需要约30分钟_Ruby On Rails_Postgresql_Activerecord_Heroku - Fatal编程技术网

Ruby on rails 发现每个批次之间需要约30分钟

Ruby on rails 发现每个批次之间需要约30分钟,ruby-on-rails,postgresql,activerecord,heroku,Ruby On Rails,Postgresql,Activerecord,Heroku,我有260万条记录,我正试图为其生成公共ID。当地最多花了3个小时 在heroku上运行rake任务需要相当长的时间: Episode.where(public_id: nil).find_each do |e| Rails.logger.info "updating #{e.id} ..." e.set_public_id e.save end set\u public\u id只生成一个代码并检查它是否重复: code = generate_code sel

我有260万条记录,我正试图为其生成公共ID。当地最多花了3个小时

在heroku上运行rake任务需要相当长的时间:

Episode.where(public_id: nil).find_each do |e|
  Rails.logger.info "updating #{e.id} ..."          
  e.set_public_id
  e.save
end
set\u public\u id
只生成一个代码并检查它是否重复:

code = generate_code
self.public_id = code
dupe = self.class.where(public_id: self.public_id)
从记录器输出来看,似乎每30分钟完成1000次。在创建列时,我确实向
:public\u id
添加了索引


我能做些什么来加快速度呢?

我认为
查找每个
默认的批处理大小对heroku来说太大了。最终使其工作的是将批量大小减少到“100”

.find_each(batch_size: 100)

find_each
中确定批大小是一个很好的决定,因为默认的批大小是1000,您还可以将它与
一起使用。lazy
find_each(批大小:100)。lazy.each do…

为什么每次都要运行重复检查?这可能需要很多额外的时间。既然我假设这是一个只运行一次的作业,为什么不忘记检查重复项,一直运行到最后,检查是否有重复项并修复它?这样会快得多,如果有的话,你可能只有1到2个副本。好主意!重复检查似乎不会影响本地性能,但这是有意义的。我还使用了一个名为activerecord import的库,用于批量保存。你可能也想调查一下。默认情况下,Activerecord不执行大容量保存,但Activerecord导入会添加它。在Heroku上,您的虚拟机与其他虚拟机共享资源,数据库实例不是本地的,等等。这一点毫不奇怪。另一种方法,而不是@David所说的修复方法,是查询一次所有非空id,并将它们保存在内存中的
集中。只有几兆字节。然后在那里进行成员资格测试,而不是每个记录单独查询一次@David的批量上传想法也很好。谢谢,这是我第一次体验这种大小的东西,所以我想我不会偷懒。你能解释一下如何将它们保存在内存中的“集合”中吗?不熟悉术语/流程。