2012-11-22 23 views
12

के पुनर्लेखन के लिए अवसर, होगा यह देखते हुए मैं, लेकिन वैसे भी, कोड यह खड़ा के रूप में:मैंने सूची <string> के साथ आउटऑफमेमरी अपवाद को मारा - क्या यह सीमा है या क्या मुझे कुछ याद आ रही है?

List<string> foobar; 

फिर हम foobar के तार का एक समूह जोड़ें।

गिनती = 16777216 पर, हमने स्मृति सीमा से बाहर मारा।

मेरी समझ यह है कि प्रत्येक स्ट्रिंग एक अलग आकार होगी। वास्तव में डेटा (मेरा डेटा नहीं) को देखते हुए, अधिकांश 2 या 3 वर्ण होते हैं।

what is the max limit of data into list in c#? इंगित करता है कि अधिकतम सीमा है:

तत्वों है कि सूची की वर्तमान कार्यान्वयन में संग्रहित किया जा सकता की अधिकतम संख्या, है सैद्धांतिक रूप से, Int32.MaxValue - बस 2 अरब से अधिक।

हालांकि

:

CLR का वर्तमान Microsoft कार्यान्वयन में एक 2GB अधिकतम ऑब्जेक्ट आकार सीमा नहीं है। मेरे पास है, क्या, 16 लाख परिणामों में कुछ बाइट्स * (यह संभव है कि अन्य कार्यान्वयन, उदाहरण मोनो के लिए, इस प्रतिबंध की जरूरत नहीं है है।)

मेरे उदाहरण में,? टास्क मैनेजर एक गिग के इस्तेमाल के बारे में दिखाता है, लेकिन मेरे पास 8 गीगा रैम है।

16777216 (2^24) एक निश्चित विशिष्ट मूल्य की तरह लगता है - संदिग्ध रूप से एक सीमा की तरह, लेकिन मुझे कोई भी दस्तावेज नहीं मिला है) इसे वापस या बी) इसके चारों ओर एक रास्ता खोजें?

किसी भी मदद की सराहना की जाएगी।


कुछ कोड:

List<string> returnList = new List<string>(); 
SqlDataReader dr; // executes a read on a database, have removed that part as that bit works fine 

    if (dr.HasRows) 
    { 
     while (dr.Read()) 
     { 
      returnList.Add(dr.GetString(0).Trim()); 
     } 
    } 

है कि सरलीकृत रूप, मैं अब यह OOM अपवाद के लिए कुछ ट्राई/कैच है, लेकिन यह वास्तविक कोड है कि मुझे दु: ख दे रहा है।

+0

क्या आप हमें अपना कोड दिखा सकते हैं? –

+0

हीप आकार रैम आकार से अलग है, रैम का एक हिस्सा ढेर के रूप में प्रयोग किया जाता है, जिसका उपयोग ऑब्जेक्ट्स को स्टोर करने के लिए किया जाता है। http://stackoverflow.com/questions/2325370/c-sharp-increase-heap-size-is-it- संभावित – CjCoax

+0

@ जोनस्केट - कुछ स्निपेट के साथ अपडेट किया गया है, अगर मुझे कुछ और चाहिए तो मुझे बताएं। –

उत्तर

7

यदि आप 64 बिट वातावरण में बहुत बड़ी सूचियों का उपयोग करने का प्रयास कर रहे हैं तो आपको एप्लिकेशन कॉन्फ़िगरेशन में बड़ी ऑब्जेक्ट्स को सक्षम करने की आवश्यकता है।

http://msdn.microsoft.com/en-us/library/hh285054.aspx

OOM के तरीके के कारण सूचियां/ArrayLists स्मृति को आबंटित है, जो मेरा मानना ​​है कि हर बार उनकी सीमा तक पहुँच जाता है है की संभावना है, वे आकार में दोगुना करने का प्रयास। सूची 2^24 से दोगुनी नहीं हो सकती है। आप आकार को पूर्व-निर्दिष्ट करके सैद्धांतिक रूप से अपनी सूची आकार को अधिकतम कर सकते हैं। (आईई 2 जीबी)

+0

यह ठीक था जो मेरे लिए किया गया था! धन्यवाद :) –

1

मैंने पोस्ट किया है जो मैंने वास्तव में किया है, इसे जाने के लायक है। फिर कदम हैं:

  1. डेटा के प्रत्येक यात्रा क्वेरी हिस्से पर एक संग्रहीत proc
  2. का उपयोग कर उन्हें अगले हिस्से

    List<string> returnList; 
    int index = 0; 
    SqlCommand cmd = new SqlCommand("ExampleStoredProc", conn); 
    cmd.CommandType = CommandType.StoredProcedure; 
    while (true) 
    { 
        cmd.Parameters.Add(
         new SqlParameter("@index", index)); 
        SqlDataReader dr = cmd.ExecuteReader(); 
        if (dr.HasRows) 
        { 
         returnList = new List<string>(); 
         returnList.Add(dr.GetString(0).Trim()); 
         //transfer data here 
        } 
        else 
        { 
         break; 
        } 
        index++; 
    } 
    

और संग्रहीत proc को

  • ले जाएँ स्थानांतरण इस तरह कुछ होना चाहिए:

    CREATE PROCEDURE ExampleStoredProc 
        @index INT 
    AS 
    BEGIN 
        SELECT * 
        FROM veryBigTable 
        WHERE Id >= (@index *1000) AND Id < ((@index + 1) * 1000) 
    END 
    GO 
    

    मैं निश्चित रूप से काम करता हूं कि आपके पास कितने रिकॉर्ड हैं, आपके पास जितना अधिक डेटा है, उतना ही अधिक समय लगेगा।

  • 1

    यदि यह मैन्युअल रूप से सही सूची आकार सेट करते समय 2^24 से भी कम हो रहा है तो यह शायद सही रास्ते पर है। 16 मिलियन तक पहुंचने के बजाय और सूची के आकार को दोगुना करने की कोशिश करने के बजाय, यह सूची को पहले से शुरू करने और स्मृति से बाहर होने के लिए वास्तव में बड़ी बना देगा।

    यह बताता है कि आपको एक गोल संख्या क्यों मिल रही थी - यह 2^24 तक पहुंच गया, फिर आकार में वृद्धि करने की कोशिश की, जिसके कारण यह बहुत अधिक स्मृति का उपयोग कर रहा था।

    मुझे लगता है कि यह किसी प्रकार की 'प्राकृतिक' वस्तु आकार सीमा है, जैसा कि सूची के कार्यान्वयन में से एक के विपरीत है।