मेरे पास टेक्स्ट की 20 मिलियन लाइनों के साथ एक बड़ी टेक्स्ट फ़ाइल है। जब मैं निम्न प्रोग्राम का उपयोग कर फ़ाइल पढ़ता हूं, तो यह ठीक काम करता है, और वास्तव में मैं बहुत बड़ी फ़ाइलों को पढ़ सकता हूं जिनमें कोई स्मृति समस्या नहीं है।मेरा जावा प्रोग्राम जो एक बड़ी टेक्स्ट फ़ाइल पढ़ता है वह स्मृति से बाहर हो रहा है, क्या कोई यह समझाने में मदद कर सकता है कि क्यों?
public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}
लेकिन अगर मैं इसे पढ़ने से पहले इस फाइल करने के लिए कुछ रिकॉर्ड संलग्न करने के लिए की जरूरत है, BufferedReader स्मृति की एक बड़ी राशि (मैं सिर्फ इस पर नजर रखने के लिए Windows कार्य प्रबंधक का इस्तेमाल किया है, न बहुत वैज्ञानिक मैं जानता हूँ कि खपत लेकिन यह समस्या का प्रदर्शन करता है)। संशोधित कार्यक्रम नीचे है, जो पहले जैसा ही है, सिवाय इसके कि मैं पहले फ़ाइल में एक रिकॉर्ड जोड़ रहा हूं।
public static void main(String[] args) throws IOException {
File tempFile = new File("temp.dat");
PrintWriter pw = null;
try {
pw = new PrintWriter(new BufferedWriter(new FileWriter(tempFile, true)));
pw.println(" ");
} catch (Exception e) {
System.out.println("pw error: " + e.getMessage());
} finally {
pw.close();
}
String tempLine = null;
BufferedReader br = null;
int lineCount = 0;
try {
br = new BufferedReader(new FileReader(tempFile));
while ((tempLine = br.readLine()) != null) {
lineCount += 1;
}
} catch (Exception e) {
System.out.println("br error: " +e.getMessage());
} finally {
br.close();
System.out.println(lineCount + " lines read from file");
}
}
विंडोज कार्य प्रबंधक, जब मैं कार्यक्रम के दूसरे संस्करण को चलाने जहां लाइन में बड़ी टक्कर स्मृति की खपत से पता चलता का स्क्रीनशॉट।
तो मैं स्मृति से बाहर चलने के बिना इस फाइल को पढ़ने में सक्षम था। लेकिन मेरे पास 50 मिलियन से अधिक रिकॉर्ड वाले बहुत बड़ी फाइलें हैं, जो कि जब मैं इस कार्यक्रम को उनके खिलाफ चलाता हूं तो स्मृति अपवाद से बाहर निकलता है? क्या कोई समझा सकता है कि प्रोग्राम का पहला संस्करण किसी भी आकार की फाइलों पर ठीक क्यों काम करता है, लेकिन दूसरा प्रोग्राम विफलता में समाप्त होता है और विफलता में समाप्त होता है? मैं विंडोज 7 पर के साथ चल रहा हूँ:
जावा संस्करण "1.7.0_05"
जावा (टीएम) एसई रनटाइम वातावरण (निर्माण 1.7.0_05-B05)
जावा हॉटस्पॉट (टीएम) क्लाइंट वी एम (निर्माण 23.1-B03 , मिश्रित मोड, साझाकरण)
यह 'BufferedReader' कि सभी स्मृति लेता है के लिए कुछ अच्छा विश्लेषण के साथ VMs चलने से ढेर-डंप पाने के लिए? मुझे संदेह होगा कि यह 'फाइलवाइटर' होगा। –
क्या मिश्रण में 'BufferedWriter' जोड़ने का कोई कारण है? यदि आप 'नया प्रिंटवाइटर (नया फ़ाइलवाइटर (...)) करते हैं तो क्या आपको अभी भी वही समस्या मिलती है? –
(प्रश्न के साथ कुछ भी करने के लिए नहीं, लेकिन मुझे यह इंगित करना होगा कि आप अंत में ब्लॉक में एनपीई प्राप्त कर सकते हैं। इसका निपटारा करने का तरीका जावा एसई 7 के साथ-साथ संसाधन का उपयोग करना है, या जावा एसई 6 उपयोग के साथ अंत में और पकड़ने के लिए अलग प्रयास करें और नल के उपयोग से बचें।) –