我有以下情形很慢:大數組操作是紅寶石
我需要在一個很大的集找出ID的唯一列表。因此,例如,我有6000個ID(陣列追隨者)陣列,每個隊列的大小範圍在1到25000之間(他們的追隨者列表)。
我想要獲得所有這些id數組(唯一追隨者的追隨者)的id的唯一列表。一旦完成,我需要從ID中減去另一個列表(另一個人追隨者列表)並獲得最終計數。
唯一ID的最終集合增長到約60,000,000條記錄。在將數組添加到大數組中時,在ruby中,它開始變得非常慢,數百萬。添加到集合中最初需要0.1秒,然後增長到200萬以上的4秒(不在我需要去的地方)。
我用java寫了一個測試程序,它在不到一分鐘的時間內完成了所有的事情。
也許我是在ruby中無效地做到這一點,或者有另一種方式。由於我的主要代碼是專有的我已經寫了一個簡單的測試程序來模擬問題:
big_array = []
loop_counter = 0
start_time = Time.now
# final target size of the big array
while big_array.length < 60000000
loop_counter+=1
# target size of one persons follower list
random_size_of_followers = rand(5000)
follower_list = []
follower_counter = 0
while follower_counter < random_size_of_followers
follower_counter+=1
# make ids very large so we get good spread and only some amt of dupes
follower_id = rand(240000000) + 100000
follower_list << follower_id
end
# combine the big list with this list
big_array = big_array | follower_list
end_time = Time.now
# every 100 iterations check where we are and how long each loop and combine takes.
if loop_counter % 100 == 0
elapsed_time = end_time - start_time
average_time = elapsed_time.to_f/loop_counter.to_f
puts "average time for loop is #{average_time}, total size of big_array is #{big_array.length}"
start_time = Time.now
end
end
任何建議,是時候切換到JRuby和這樣移動的東西java嗎?
只是想指出你的timing部分有'loop_counter = 0'。雖然數組訪問方法比建議的哈希方法慢**,但循環時間實際上並不快速增長。通過200萬條記錄,我的機器上的循環時間從.09秒的初始循環時間增加到了大約0.27秒。 –
Ruby很快,你只是做錯了。這實際上是數據庫的一種用例,而不是任何語言的內存數組操作。一個好的DBM可以在查詢離開數據庫之前快速找到不同的值和關聯。我會推薦[Sequel](http://sequel.rubyforge.org/)作爲一個優秀的數據庫ORM,以便維護和查詢。 –