मैं इस परिदृश्य पर है में बहुत धीमी है।बड़ा सरणी हेरफेर माणिक
तो उदाहरण के लिए, मेरे पास 6000 एरे (अनुयायी सूची) हैं, प्रत्येक आकार 1 और 25000 (उनकी अनुयायी सूची) के बीच आकार में हो सकता है।
मैं आईडी के इन सभी सरणी (अनुयायियों के अद्वितीय अनुयायियों) में आईड्स की अनूठी सूची प्राप्त करना चाहता हूं। एक बार ऐसा करने के बाद मुझे आईड्स की एक और सूची (अन्य व्यक्ति अनुयायी सूची) घटाएं और अंतिम गिनती प्राप्त करें।
अद्वितीय आईडी का अंतिम सेट लगभग 60,000,000 रिकॉर्ड तक बढ़ता है। बड़ी सरणी में सरणी जोड़ने पर रूबी में, यह कुछ मिलियन के आसपास बहुत धीमी गति से शुरू होता है। सेट में जोड़ने से पहले 1 सेकंड लगते हैं, फिर 4 मिलियन से अधिक समय लेते हैं (जहां कहीं मुझे जाना है)।
मैंने जावा में एक परीक्षण कार्यक्रम लिखा और यह पूरी बात एक मिनट से भी कम समय में करती है।
शायद मैं रूबी में यह अक्षमता से कर रहा हूं, या कोई दूसरा तरीका है।
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 करने के लिए स्विच और जावा के लिए इस तरह सामान ले जाने के लिए समय आ गया है: चूंकि मेरी मुख्य कोड स्वामित्व है मैं एक साधारण परीक्षण कार्यक्रम मुद्दा अनुकरण करने के लिए लिखा था है?
बस करना चाहता था इंगित करें कि आपके पास अपने समय अनुभाग में 'loop_counter = 0' था। जबकि सर-एक्सेसिंग दृष्टिकोण ** हैश दृष्टिकोण के मुकाबले ** बहुत धीमा ** है, लूप समय वास्तव में तेज़ नहीं होता है। 2 मिलियन रिकॉर्ड तक, लूप टाइम मेरी मशीन पर .0 9 सेकेंड के शुरुआती लूप समय से .27 सेकेंड तक चलता है। –
रुबी बहुत तेज है, आप बस इसे गलत तरीके से कर रहे हैं। यह वास्तव में डेटाबेस के लिए उपयोग-मामला है, किसी भी भाषा में इन-मेमोरी सरणी हेरफेर नहीं। डेटाबेस से बाहर निकलने से पहले एक अच्छा डीबीएम जल्दी से अलग-अलग मूल्यों और संघों को ढूंढ सकता है। मैं [सीक्वेल] (http://sequel.rubyforge.org/) को एक महान डेटाबेस ओआरएम के रूप में अनुशंसा करूंगा जो इसे बनाए रखने और क्वेरी को आसान बना देगा। –