2010-01-07 16 views
6

ग्रीटिंग्स, मुझे डेटाबेस से बड़ी संख्या में रिकॉर्ड मिलते हैं और फ़ाइल में लिखते हैं। मैं सोच रहा था कि बड़ी फाइलें लिखने का सबसे अच्छा तरीका क्या है। (1 जीबी - 10 जीबी)।जावा: बड़ी फाइलें लिखना?

वर्तमान में मैं BufferedWriter

BufferedWriter mbrWriter=new BufferedWriter(new FileWriter(memberCSV)); 
while(done){ 
//do writings 
} 
mbrWriter.close(); 
+1

मुझे उचित लगता है (एक यादृच्छिक वर्णमाला चुनने और अंत में ब्लॉक में अंतर्निहित धारा को बंद करने के अलावा)। संभवतः प्रदर्शन समस्या नीचे दी जाएगी कि डिस्क डेटा कितनी तेज़ी से लिख सकती है (और शायद यह फिर से पढ़ना चाहती है)। –

+1

(या उस डेटाबेस में समेकन। कनेक्शन के लिए अलगाव स्तर सेट करें। शायद fetch आकार सेट करें।) –

उत्तर

9

उपयोग कर रहा हूँ आप वास्तव में इस के लिए जावा का उपयोग कर जोर देते हैं, तो सबसे अच्छा तरीका है तुरंत जैसे ही लिखने के रूप में डेटा में आता होगा और इस तरह नहीं सभी इकट्ठा करने के लिए जावा की स्मृति में ResultSet से डेटा पहले। आपको जावा में कम से कम उस मुफ्त मेमोरी की आवश्यकता होगी अन्यथा।

इस प्रकार, उदाहरण के लिए

while (resultSet.next()) { 
    writer.write(resultSet.getString("columnname")); 
    // ... 
} 

जिसके अनुसार, builtin निर्यात करने वाली सीएसवी क्षमताओं जो undoubtely तरह से और अधिक कुशल से आप कभी भी जावा में कर सकता है कर रहे हैं के साथ सबसे अधिक सभ्य DB के जहाजों। आपने इसका उल्लेख नहीं किया कि आप किस का उपयोग कर रहे हैं, लेकिन यदि यह उदाहरण के लिए MySQL था, तो आप इसके लिए LOAD DATA INFILE का उपयोग कर सकते थे। बस डीबी-विशिष्ट दस्तावेज देखें। उम्मीद है कि यह नई अंतर्दृष्टि देता है।

4

बुफर्डवाइटर के लिए डिफ़ॉल्ट बफर आकार 8192 है। यदि आप स्कीगाबाइट फ़ाइलों को लिखने जा रहे हैं, तो आप इसे 2 तर्क कन्स्ट्रक्टर का उपयोग करके बढ़ाना चाहते हैं; जैसे

int buffSize = ... // 1 megabyte or so 
BufferedWriter mbrWriter = new BufferedWriter(new FileWriter(memberCSV), buffSize); 

यह फ़ाइल लिखने के लिए आवश्यक सिस्कोल की संख्या को कम करना चाहिए।

लेकिन मुझे संदेह है कि इससे कुछ प्रतिशत अंतर आएंगे। परिणामसेट से पंक्तियों को खींचना शायद मुख्य प्रदर्शन बाधा होगी। प्रदर्शन में महत्वपूर्ण सुधार के लिए आपको डेटाबेस की मूल थोक निर्यात सुविधाओं का उपयोग करना होगा।

0

मैं 100% निश्चित नहीं हूं, लेकिन ऐसा लगता है कि BufferedReader डेटा को रैम में एक बफर में लोड करता है। जावा 128 एमबी राम का उपयोग कर सकता है (जब तक कि अन्यथा निर्दिष्ट नहीं किया जाता है), तो बुफर्ड रीडर संभवतः जावा की स्मृति को बहने की त्रुटि देगा। इनपुट को पढ़ने और फिर डेटा को स्टोर करने के लिए इनपुटस्ट्रीम रीडर और फ़ाइल इनपुटस्ट्रीम का उपयोग करने का प्रयास करें, फिर फ़ाइल आउटपुटस्ट्रीम का उपयोग करके उस char को लिखें।

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