मेरे पास तारों का एक बड़ा संग्रह (1 एम तक) वर्णानुक्रम से क्रमबद्ध है। मैंने हैशसेट, सॉर्टेड डिक्शनरी और डिक्शनरी का उपयोग करके इस संग्रह के खिलाफ LINQ प्रश्नों के साथ प्रयोग किया है। मैं संग्रह को स्थिर कैशिंग कर रहा हूं, यह आकार में 50 एमबी तक है, और मैं हमेशा कैश संग्रह के खिलाफ LINQ क्वेरी को कॉल कर रहा हूं। मेरी समस्या निम्नानुसार है:बड़े संग्रह के लिए LINQ प्रदर्शन
संग्रह प्रकार के बावजूद, प्रदर्शन SQL (200ms तक) से अधिक गरीब है। अंतर्निहित SQL तालिकाओं के खिलाफ एक समान क्वेरी करते समय, प्रदर्शन बहुत तेज़ (5-10 मिमी) होता है।
public static string ReturnSomething(string query, int limit)
{
StringBuilder sb = new StringBuilder();
foreach (var stringitem in MyCollection.Where(
x => x.StartsWith(query) && x.Length > q.Length).Take(limit))
{
sb.Append(stringitem);
}
return sb.ToString();
}
यह मेरी समझ है कि HashSet, शब्दकोश, आदि मानक गणना के बजाय द्विआधारी पेड़ खोज का उपयोग कर लुकअप लागू है: इस प्रकार मैं अपने LINQ प्रश्नों को लागू किया है। उन्नत प्रदर्शन प्रकारों में उच्च प्रदर्शन LINQ क्वेरी के लिए मेरे विकल्प क्या हैं?
उत्कृष्ट! उच्च प्रदर्शन और वास्तव में जो मैं खोज रहा था। क्या आप गैर-स्ट्रिंग ऑब्जेक्ट्स के संग्रह पर गुणों में क्वेरी करने के लिए इस विधि (पाठ्यक्रम के संशोधित) की अनुशंसा करेंगे? –
हां, आप इंडेक्स क्लास जेनेरिक बना सकते हैं और सूची के बजाय हैशसेट का उपयोग कर सकते हैं, फिर आप विभिन्न गुणों के लिए इंडेक्स बना सकते हैं और आइटम को खोजने के लिए हैशसेट्स को अलग कर सकते हैं। – Guffa
इंडेक्स लम्बाई से कम स्ट्रिंग्स के बारे में क्या - जोड़ें() उन्हें स्टोर नहीं करेगा और ढूंढें() उन्हें नहीं मिलेगा? – Sam