【问题标题】:How to chunk an array in Ruby如何在 Ruby 中对数组进行分块
【发布时间】:2010-11-16 20:20:31
【问题描述】:

在 Ruby 1.8.6 中,我有一个包含 100,000 个用户 ID 的数组,每个用户 ID 都是一个 int。我想对这些用户 ID 执行一段代码,但我想分块执行。例如,我想一次处理 100 个。我怎样才能尽可能简单地轻松实现这一目标?

我可以执行以下操作,但可能有更简单的方法:

a = Array.new
userids.each { |userid|
  a << userid
  if a.length == 100
    # Process chunk
    a = Array.new
  end
}
unless a.empty?
  # Process chunk
end

【问题讨论】:

标签: ruby arrays


【解决方案1】:

使用each_slice:

require 'enumerator' # only needed in ruby 1.8.6 and before
userids.each_slice(100) do |a|
  # do something with a
end

【讨论】:

  • 请注意,您实际上必须明确地“要求'枚举器'”才能工作:该方法在混合 Enumerable 的类中不可用,这最初让我认为这个答案是错误的。然后我学得更好。
  • 是的,你必须在 1.8.6 中要求 'enumerator' 才能工作(这就是我这样做的原因)。在 1.8.7+ 中,枚举器已移至核心,您不再需要它。但是这样做不会导致错误,而只是返回 false。因此,出于兼容性原因,在使用枚举器中的方法时,您应该始终需要“枚举器”,以便代码适用于所有版本的 ruby​​。
  • @andorov 对。任何高于 1.8.6 的 Ruby 版本都不需要它(如我之前的评论中所述)。
【解决方案2】:

Rails 有in_groups_of,在后台使用each_slice

userids.in_groups_of(100){|group|
  //process group
}

【讨论】:

  • 我们不使用 Rails。它的规模对我们来说不够远;我们的数据库被分成大约 26 个分片。另外,我们还有大量其他数据库服务器,可能还有二十个左右,尽管这些没有分片。不过,感谢您的建议,我相信这对很多其他人都会有用。
  • 是的,知道您没有使用 Rails,这就是为什么我链接到源代码,以便您可以根据需要提取该方法。
  • 以及为什么我给你+1。 :) 一个很好的答案,它并不特别适合我,但对其他人有用。
  • 感谢您 - 我在查看 rails 文档时错过了它。只是为了澄清最后一条评论,这个 is 在 Rails 3.x (docs) 中可用。此外,虽然这已经晚了 3 年,但您可以将 active_support 包含在非 Rails 项目中,因为它本身就是一个宝石。
猜你喜欢
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
  • 2017-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-22
相关资源
最近更新 更多