У меня есть большой текстовый файл с 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");
}
}
Снимок экрана диспетчера задач Windows, где большой удар в строке показывает потребление памяти при запуске второй версии программы.
Итак, я смог прочитать этот файл, не исчерпав память. Но у меня гораздо больше файлов с более чем 50 миллионами записей, которые сталкиваются с избытком памяти, когда я запускаю эту программу против них? Может кто-нибудь объяснить, почему первая версия программы отлично работает на файлы любого размера, но вторая программа ведет себя по-разному и заканчивается неудачей? Я запускаю Windows 7 с помощью:
java-версия "1.7.0_05"
Java (TM) SE Runtime Environment (сборка 1.7.0_05-b05)
Клиентская виртуальная машина Java HotSpot (TM) (сборка 23.1-b03, смешанный режим, совместное использование)