经过一定数量的记录后清除内存

Avd*_*ept 4 ruby garbage-collection ruby-on-rails sidekiq

我在数据库中有几m条记录,需要时不时地处理它。但是此操作占用了我服务器上的所有内存。我正在使用 sidekiq 运行此操作。因此,虽然此任务使用所有内存,但我的 Rails 应用程序变得非常慢。

一般来说(不包括逻辑)我的代码看起来像

Model.each do |m|
//do some logic code here
end
Run Code Online (Sandbox Code Playgroud)

我如何让垃圾收集器在一定数量的记录(例如 10k 记录)之后运行,这样我就不会面临内存不足的情况。将其分成块会对我有帮助吗?

Kos*_*sis 5

在处理可能很大的表时,您应该始终使用find_each 。

这样,模型将从数据库中检索并批量加载到内存中(默认大小为 1000,但您可以根据需要自定义它)。

请注意,按任意列排序并不能很好地使用find_each,因为它隐式地按 ID 对记录进行排序,以便它可以批量获取记录。