我正在使用包含大约400,000个项目的数组。我在ruby docs上查看了Enumerables each_slice
方法,并且想知道如果将它用于这个大小的数组会有什么不同。
根据Rails文档:
1.2批量检索多个对象我们经常需要迭代一大堆记录,就像我们向大型记录发送简报一样 用户集,或者我们导出数据时。
这可能看起来很简单:
# This is very inefficient when the users table has thousands of rows. User.all.each do |user| NewsMailer.weekly(user).deliver_now end
但是 这种方法随着桌子的大小变得越来越不切实际 因为User.all.each指示Active Record获取,所以会增加 整个表在一次传递中,每行构建一个模型对象,然后 将整个模型对象数组保留在内存中。的确,如果我们有一个 大量记录,整个集合可能超过金额 可用的内存。
Rails提供了两种方法来解决这个问题 记录到内存友好的批处理中。第一种方法, find_each,检索一批记录,然后将每条记录生成 块作为模型单独。第二种方法,find_in_batches, 检索一批记录,然后将整个批次生成到 阻止作为一系列模型。
find_each和find_in_batches方法适用于 批量处理大量不适合的记录 记忆一下子。如果你只需要循环上千条记录 常规查找方法是首选方法。
根据此文档,如果我有超过1,000个数组项,那么我是否会开始研究each_slice
?另外,我怎么知道我应该将它分成多少以帮助节省内存?有没有办法解决这个问题?