मैं निम्नलिखित समस्या पर ठोकर खाई।
मैं 1 से 100.000.000 से सभी नंबरों के साथ हैशसेट चाहता हूं।संग्रह शुरू करते समय हैशसेट स्मृति के साथ क्या करता है?
var mySet = new HashSet<int>();
for (var k = 1; k <= 100000000; k++)
mySet.Add(k);
कि कोड यह नहीं था के बाद से मैं स्मृति अतिप्रवाह 49mil के आसपास कहीं मिल गया: मैं निम्नलिखित कोड की कोशिश की। यह भी बहुत धीमी थी और स्मृति अत्यधिक बढ़ी।
फिर मैंने कोशिश की।
var mySet = Enumerable.Range(1, 100000000).ToHashSet();
जहां ToHashSet() निम्नलिखित कोड है:
public static HashSet<T> ToHashSet<T>(this IEnumerable<T> source)
{
return new HashSet<T>(source);
}
मैं एक स्मृति अतिप्रवाह फिर से मिल गया, लेकिन मैं पिछले कोड के साथ तो और अधिक संख्या में डाल करने में सक्षम था।
var tempList = new List<int>();
for (var k = 1; k <= 100000000; k++)
tempList.Add(k);
var numbers = tempList.ToHashSet();
यह लेता है के बारे में 800ms अपने सिस्टम पर सिर्फ tempList जहां Enumerable.Range() केवल 4 टिक लेता भरने के लिए:
बात यह है कि काम करता है निम्नलिखित है!
मुझे हैशसेट की आवश्यकता है या अन्यथा इसे देखने के लिए अधिक समय लगेगा (मुझे यह ओ (1) होना चाहिए) और यह बहुत अच्छा होगा अगर मैं इसे सबसे तेज़ तरीका कर सकूं।
अब मेरा प्रश्न है:
पहले दो तरीकों से मेमोरी ओवरफ्लो क्यों होता है जहां तीसरा नहीं होता है?
क्या कुछ विशेष हैशसेट प्रारंभ करने पर स्मृति के साथ कुछ करता है?
मेरे सिस्टम में 16 जीबी मेमोरी है इसलिए मुझे अतिप्रवाह अपवाद मिलने पर मुझे आश्चर्य हुआ।
नोट्स की एक बात यह है कि 'एन्यूमेरेबल। रेंज' बहुत तेज़ है क्योंकि यह वास्तव में कुछ भी उत्पन्न नहीं करता है जब आप इसे चलाते हैं। इसका उपयोग केवल तभी किया जाता है (यानी 'ToHashSet' कॉल में) कि यह वास्तव में संख्याओं को उत्पन्न करना शुरू करता है। – Chris
@ क्रिस उसे नहीं पता था। धन्यवाद :)। – Mixxiphoid
यह सभी linq प्रकार संख्यात्मक सामान के साथ समान है। यदि आपने एक संख्यात्मक या चयन या किसी अन्य चीज पर मूल रूप से अधिक ienumerables को वापस किया है, तो यह उनके निष्पादन को तब तक स्थगित कर देगा जब तक उनका उपयोग नहीं किया जाता है। यह जानना उपयोगी है क्योंकि इस व्यवहार के कारण आपके पास कुछ गठिया हो सकते हैं (हालांकि ऑफहैंड मैं संक्षिप्त उदाहरण के बारे में नहीं सोच सकता)। – Chris