2011-11-23 70 views
1

我想比较两个散列。每个可以有超过20,000个物体。Ruby可以处理大型散列对象

我有以下问题:

  • 能红宝石处理如此大量的对象?
  • 比较这两个哈希会花费很多时间吗?
  • 可以使用索引来减少枚举吗?
+0

我认为这不是关于rails,而是关于ruby。 – ShiningRay

+1

您需要更具体地了解您的“对象”字词。你比较简单的字符串/整数...比较一个简单的字符串散列和20 000+条目的整数是即时的。 –

回答

2

Rails是一个框架,与对象比较无关。 Ruby当然可以比较20,000个对象,假设它们很适合内存,或者您正在批量处理中比较它们,从而限制了在任何时候实例化的对象数量。

如果您正在讨论比较20,000 ActiveRecord对象内存中您可能会用完内存并且即使您不这样也可能会遇到相当慢的结果。 ActiveRecord相当重,并不是处理大量对象的最佳工具。但是,我不知道这2万个对象是什么,或者你是如何比较它们的,所以也许它们不必全部同时在内存中,批处理可以在您认为可接受的时间范围内完成此操作。

如果这是一个简单的红宝石哈希简单的对象,你可以通过他们肯定迭代很快(虽然什么快速完全依赖于这是什么)。如果比较逻辑非常简单,那么不应该太费时,假设第一个散列中的每个对象与第二个散列中的单个对应对象进行比较。如果散列1中的每个对象都与散列2中的每个散列2进行比较,那么您的总体比较(20,000 * 20,0000)会更大,并且这可能不会像您需要的那样快。

+0

它的速度够快,甚至更好。 –

4

哈希本身很快,并且不会受到下限的限制。例如。这在这里甚至不需要一毫秒(在Windows上为Ruby 1.9.2):

irb(main):008:0> hash1 = (0...20000).inject({}) { | r, i | r[rand(100)*100000 + i] = rand; r } ; 23 
=> 23 
irb(main):009:0> hash2 = (0...20000).inject({}) { | r, i | r[rand(100)*100000 + i] = rand; r } ; 23 
=> 23 
irb(main):010:0> hash3 = hash1.dup ; 23 
=> 23 
irb(main):011:0> hash1 == hash2 
=> false 
irb(main):012:0> hash1 == hash3 
=> true 

其他一切都取决于你填入哈希值。

+0

感谢这个例子帮了我很多。 –