मान लीजिए कि हमारे पास List<Point> pointList
(पहले से ही स्मृति में संग्रहीत) की एक बड़ी सूची है, जहां प्रत्येक Point
में एक्स, वाई, और जेड समन्वय शामिल है।ऑर्डरबी से कैसे बचें - मेमोरी उपयोग की समस्याएं
अब, उदाहरण के लिए, मैं pointList
में संग्रहीत सभी बिंदुओं के सबसे बड़े जेड-वैल्यू वाले अंकों का एन% चुनना चाहता हूं। अभी मैं ऐसा कर रहा हूँ:
N = 0.05; // selecting only 5% of points
double cutoffValue = pointList
.OrderBy(p=> p.Z) // First bottleneck - creates sorted copy of all data
.ElementAt((int) pointList.Count * (1 - N)).Z;
List<Point> selectedPoints = pointList.Where(p => p.Z >= cutoffValue).ToList();
लेकिन मैं यहाँ दो स्मृति उपयोग बाधाओं है: पहला दौरान OrderBy (अधिक महत्वपूर्ण) और दूसरे अंक (यह कम महत्वपूर्ण है, क्योंकि हम आम तौर पर करना चाहते हैं का चयन दौरान अंक की केवल छोटी मात्रा का चयन करें)।
क्या कम स्मृति का उपयोग करने वाली किसी चीज़ के साथ ऑर्डरबी (या शायद इस कटऑफ पॉइंट को ढूंढने का अन्य तरीका) को बदलने का कोई तरीका है?
समस्या काफी महत्वपूर्ण है, क्योंकि LINQ पूरे डेटासेट की प्रतिलिपि बनाता है और बड़ी फ़ाइलों के लिए मैं इसे संसाधित कर रहा हूं कभी-कभी कुछ सैकड़ों एमबी हिट करता है।
मुझे लगता है कि यहां बड़ी समस्या यह है कि आप स्मृति में इतने लाखों डेटा पॉइंट्स में हेरफेर करने की कोशिश कर रहे हैं। आप कुछ प्रकार के डेटाबेस का उपयोग क्यों नहीं कर रहे हैं? – Aaronaught
@Aaronaught - मैं मानता हूं कि अधिकांश डेटाबेस किसी दूसरे विचार के बिना इसका ख्याल रखेंगे। * (इनफॉर्मिक्स को छोड़कर, जो आपके डेटा को दूषित करने की एक बड़ी संभावना के साथ कई विचार लेगा।) * – ChaosPandion
@ अर्नोश, दुर्भाग्यवश, मैं केवल बड़ी परियोजना का हिस्सा बना रहा हूं और मुझे सूची में पहले ही संग्रहित सूची मिल रही है। इसलिए इसे कॉपी करने से बचना महत्वपूर्ण है। – Gacek