मेरे पास एक प्रक्रिया है जिसे मैंने विरासत में मिला है कि मैं दूसरी भाषा से सी # में परिवर्तित हो रहा हूं। गणना करने के लिए बहुत सारे रिकॉर्ड (100K-200K) के माध्यम से प्रक्रिया लूप में कई कदम हो सकते हैं। उन प्रक्रियाओं के भाग के रूप में यह आमतौर पर कुछ मूल्यों को पुनर्प्राप्त करने के लिए एक और सूची में एक लुकअप करता है। मैं आम तौर पर इस तरह की चीज को एसक्यूएल कथन में ले जाऊंगा (और हमारे पास जहां हम सक्षम हैं) लेकिन इन मामलों में वास्तव में ऐसा करने का एक आसान तरीका नहीं है। कुछ स्थानों पर हमने कोड को संग्रहीत प्रक्रिया में बदलने का प्रयास किया है और फैसला किया है कि यह लगभग काम नहीं कर रहा था और साथ ही हमने आशा की थी।एकाधिक गुणों में सूची <T> सूची खोजने का सबसे तेज़ तरीका क्या है?
प्रभावी ढंग से, कोड इस करता है:
var match = cost.Where(r => r.ryp.StartsWith(record.form.TrimEnd()) &&
r.year == record.year &&
r.period == record.period).FirstOrDefault();
लागत एक स्थानीय सूची प्रकार है। अगर मैं केवल एक फ़ील्ड पर खोज कर रहा था तो शायद मैं इसे सिर्फ एक शब्दकोश में ले जाऊंगा। रिकॉर्ड हमेशा अद्वितीय नहीं होते हैं।
जाहिर है, यह वास्तव में धीमा है।
मैं ओपन सोर्स लाइब्रेरी I4O पर चला गया जो इंडेक्स बना सकता है, हालांकि यह मेरे लिए विभिन्न प्रश्नों में विफल रहता है (और मेरे पास वास्तव में स्रोत कोड डीबग करने का प्रयास करने का समय नहीं है)। यह भी काम नहीं करता है। स्टार्ट्स विथ या कॉन्टैन्स (स्टार्ट्सविथ बहुत महत्वपूर्ण है क्योंकि बहुत से मूल प्रश्न इस तथ्य का लाभ उठाते हैं कि "ए" की खोज करने से "एबीसी" में एक मैच मिल जाएगा)।
क्या कोई अन्य परियोजनाएं (ओपन सोर्स या वाणिज्यिक) हैं जो इस तरह की चीज करते हैं?
संपादित करें:
मैं कुछ प्रतिक्रिया के आधार पर और खोज पाया Power Collections जो शब्दकोशों है कि कुंजी है कि अद्वितीय नहीं हैं का समर्थन करता है था।
मैंने ToLookup() का परीक्षण किया जो बहुत अच्छा काम करता है - यह अभी भी मूल कोड जितना तेज़ नहीं है, लेकिन यह कम से कम स्वीकार्य है। यह 45 सेकंड से 3-4 सेकंड तक नीचे है। मैं अन्य लुक अप के लिए ट्री संरचना पर एक नज़र डालेगा।
धन्यवाद।
क्या प्रक्रिया लूप रिकॉर्ड के एक ही सेट पर बहुत सारे लुकअप करता है, या रिकॉर्ड सेट केवल एक बार की आवश्यकता से पहले कुछ बार उपयोग किया जाता है? – Telastyn
यह रिकॉर्ड के उसी सेट पर एक लूप करता है। तो एक ही लुकअप पूरे समय इस्तेमाल किया जाता है। पुराने कोड में 1-2 सेकंड लगने वाली प्रक्रिया का एक चरण नए कोड में 35 सेकंड लेता है। –
देखने के लिए एक और चीज समस्या को अलग-अलग धागे ('समानांतर.फोरिएच' के माध्यम से) को किसी निश्चित क्रम में पुनरावृत्त करने के लिए महत्वपूर्ण नहीं है, इसके आधार पर समस्या को मैप करना होगा। –