Ho un grande file di testo con 20 milioni di righe di testo. Quando leggo il file utilizzando il seguente programma, funziona perfettamente e in effetti riesco a leggere file molto più grandi senza problemi di memoria.Il mio programma Java che legge un grande file di testo sta esaurendo la memoria, qualcuno può aiutare a spiegare perché?
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");
}
}
Tuttavia, se ho bisogno di aggiungere alcuni record di questo file prima di leggerlo, il BufferedReader consuma una grande quantità di memoria (ho appena usato task manager di Windows per monitorare questo, non molto scientifico lo so, ma dimostra il problema). Il programma modificato è il seguente, che è lo stesso del primo, ad eccezione del fatto che accludo un singolo record al file per primo.
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");
}
}
Una schermata Windows task manager, in cui la grande urto nella riga mostra il consumo di memoria quando si esegue la seconda versione del programma.
quindi ero in grado di leggere questo file, senza esaurire la memoria. Ma ho file molto più grandi con oltre 50 milioni di record, che incontrano un'eccezione di memoria insufficiente quando eseguo questo programma contro di loro? Qualcuno può spiegare perché la prima versione del programma funziona bene su file di qualsiasi dimensione, ma il secondo programma si comporta in modo così diverso e finisce in errore? Sono in esecuzione su Windows 7 con:
versione java "1.7.0_05"
Java (TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot (TM) Cliente VM (build 23.1-B03 , modalità mista, condivisione)
E 'la 'BufferedReader' che prende tutta la memoria? Preferirei sospettare che sarebbe il "FileWriter" a farlo. –
C'è un motivo per aggiungere un 'BufferedWriter' nel mix? Hai ancora lo stesso problema se esegui 'new PrintWriter (new FileWriter (...))'? –
(Niente a che vedere con la domanda, ma devo sottolineare che è possibile ottenere un NPE nel blocco finally. Il modo per gestirlo è utilizzare la risorsa try-with di Java SE 7 o utilizzare Java SE 6 prova separata per l'ultimo e cattura ed evita l'uso di null.) –