2013-11-21 8 views
5

मेरे पास एक एक्सएमएल फ़ाइल है जो डेटाबेस (ओरेकल 11 जी यूनिकोड) तालिका के निर्यात से होती है। इस तालिका में एक बीएलओबी फ़ील्ड है जो एक फ़ाइल का प्रतिनिधित्व करता है। फ़ाइल बहुत बड़ी हो सकती है।बाइट ऐरे में बहुत बड़ी स्ट्रिंग

तो ऐसे मामले में जहां मेरे पास XML में एक बहुत बड़ी फ़ाइल है, उस फ़ाइल का एक बहुत बड़ा स्ट्रिंग प्रस्तुतीकरण।

मुझे किसी अन्य डेटाबेस उदाहरण में फ़ाइल डालने के लिए इस स्ट्रिंग के बाइट प्राप्त करना होगा।

इस बिंदु पर एक्सएमएल चार्ज किया गया है और मेरे पास फ़ाइल का प्रतिनिधित्व करने वाली एक स्ट्रिंग है।

Encoding.Unicode.GetBytes(stringFileRepresentation);

लेकिन मैं एक OutOfMemoryException हो रही है:

यह क्या मेरे द्वारा की गई है।

अगर मैं ऐसा करते हैं:

Encoding.Unicode.GetBytes(stringFileRepresentation.ToCharArray());

मैं भी एक OutOfMemoryException मिलता है।

मैं भी कोशिश की स्ट्रिंग डिकोडिंग से पहले यह करने के लिए:

var chars = stringFileRepresentation.ToCharArray(); 
Encoding.Unicode.GetBytes(chars); 

और जब ToCharArray() बुला रहा OutOfMemoryException रही।

तो मुझे लगता है कि प्रसंस्करण स्ट्रिंग है।

तो मैं निम्न विधि है कि मैं here घटना पाया अगर मुझे यकीन है कि मैं स्ट्रिंग की एन्कोडिंग conservate करने के लिए है नहीं कर रहा हूँ कोशिश कर रहा हूँ:

byte[] bytes = new byte[str.Length * sizeof(char)]; 
Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length); 

लेकिन मैं instantiating में भी एक OutOfMemoryException हो रही है bytes चर।

अब, मैं OutOfOptions चला गया और मुझे नहीं पता कि क्या करना है।

+1

बाइट सरणी प्राप्त करने के बाद डेटाबेस में ब्लॉब कैसे लिखेंगे? क्या कोई स्ट्रीमिंग विकल्प है? (आदर्श रूप से, आपको स्ट्रिंग के रूप में भी पूरी फ़ाइल को स्मृति में रखने की आवश्यकता नहीं है ...) –

+2

वैकल्पिक रूप से दो डेटाबेस को एक-दूसरे से बात करने के लिए एक तरीका तैयार करें। – samjudson

+0

मैंने ओडीपी.NET को देखना शुरू कर दिया और मुझे स्ट्रीमिंग विकल्प नहीं दिखाई देता। ऐसा लगता है कि आपको इसे अपने आप में भाग में तोड़ने की ज़रूरत होगी और बस डेटाबेस में फ़ील्ड को जोड़ना होगा। हो सकता है कि एक एसपीआरओसी लिखें जो बाइट्स को वर्तमान फ़ील्ड में जोड़ देगा और लूप इसे सम्मिलित करने के लिए कॉल कर देगा जब तक कि आपने ऑब्जेक्ट – Wjdavis5

उत्तर

4

आप पहले से ही स्मृति में मूल पूर्ण स्ट्रिंग मिल गया है के बाद से, आप इसे माध्यम से बफ़र होना एक StringReader उपयोग कर सकते हैं:

यह एक फ़ाइल में पाठ मिल जाएगा। आप फ़ाइल की बजाय एक अलग स्ट्रीम को लिखने के लिए एक समान तकनीक का उपयोग कर सकते हैं।

using (var sr = new StringReader(fileContents)) 
{ 
    using (var outputWriter = new StreamWriter(@"C:\temp\output.txt")) 
    { 
     char[] buffer = new char[10]; 
     int numChars; 
     while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0) 
     { 
      outputWriter.Write(buffer, 0, numChars); 
     } 
    } 
} 

संपादित

एक फ़ाइल के अलावा कुछ करने के लिए लेखन बहुत इसी तरह की है - उदाहरण के लिए, मान लीजिए आप एक धारा (धारा किस तरह का कोई फर्क नहीं पड़ता के लिए सीधे लिखना चाहते थे - एक हो सकता है मेमोरीस्ट्रीम, एचटीपी रीस्पॉन्स स्ट्रीम, फाइलस्ट्रीम, इत्यादि):

using (var sr = new StringReader(fileContents)) 
{ 
    using (var outputStream = GetSomeStreamFromSomewhere()) 
    { 
     char[] buffer = new char[10]; 
     int numChars; 
     while ((numChars = sr.ReadBlock(buffer, 0, buffer.Length)) > 0) 
     { 
      char[] temp = new char[numChars]; 
      Array.Copy(buffer, 0, temp, 0, numChars); 
      byte[] byteBuffer = Encoding.UTF8.GetBytes(temp); 
      outputStream.Write(byteBuffer, 0, byteBuffer.Length); 
     } 
    } 
} 
+0

स्ट्रिंग पहले से ही एक फ़ाइल से आता है, मुझे इसे फिर से फ़ाइल में रखने के लिए उपयोगी नहीं लगता है। फिर भी आपका धन्यवाद! – sabotero

+0

मुझे नहीं पता कि आप अपनी सामग्री के साथ क्या कर रहे हैं। उम्मीद है कि आपके पास इसे अंतिम गंतव्य में भाग में लिखने की कुछ विधि है। उस स्थिति में, 'StreamWriter' के बजाय, आप अपने अंतिम गंतव्य से जुड़ी कुछ अन्य स्ट्रीम खोलेंगे, फिर चार बफर को एक छोटे बाइट सरणी में परिवर्तित करें, और उस बाइट सरणी को स्ट्रीम में लिखें। .NET धाराएं अधिकतर अदला-बदली होती हैं, इसलिए कोड समान होगा। –

+0

मैं देवता के बीच में एक ऑरैक डेटाबेस में सामग्री लिखने की कोशिश कर रहा हूं। – sabotero

संबंधित मुद्दे