2011-11-23 42 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

感謝這個例子幫了我很多。 –