【发布时间】:2012-08-12 06:52:35
【问题描述】:
我有一个非常大的哈希值,我想对其进行迭代。 Hash.each 似乎太慢了。
有什么有效的方法吗?
如何将此哈希转换为数组?
在每个循环中,我都在做非常简单的字符串操作:
name_hash.each {|name, str|
record += name.to_s + "\|" + str +"\n"
}
hash以人名为key,一些相关内容为value:
name_hash = {:"jose garcia" => "ca:tw#2@1,2@:th#1@3@;ar:tw#1@4@:fi#1@5@;ny:tw#1@6@;"}
【问题讨论】:
-
我试过 .each,1M 的记录哈希需要 5 多个小时
-
我在问您是否尝试过您认为的解决方案。
-
哈希迭代本身应该是“快的”。在 Ruby 2x 中,它是用“链接链”实现的(为了保持良好的顺序属性)。迭代期间正在做什么? (1M - 100 万?? - 是“相当数量”的项目,所以即使每个项目都需要 0.01 秒或 100/秒,也需要 2.7 小时。也就是说,问题可能在内部 i>
each块而不是每个方法/迭代本身。也许有更好的方法来解决这个问题?) -
请附上完整的相关代码。正如 djconnel 在答案中所示,实际迭代非常快。因此,高度怀疑在 内部
each块所做的事情是瓶颈。 DigitalRoss 还建议,假设哈希数据来自或利用数据库/模型本身,可能会有更好/不同的解决方案。 -
一个没有被问到的问题是,您正在使用的机器上有多少可用 RAM? 100 万条记录的 5 小时似乎很长,除非您所在的机器受到内存限制并且正在交换。
标签: ruby-on-rails ruby arrays hash