다음 편집기는 Java에서 대용량 파일을 읽을 때 발생하는 메모리 오버플로 문제를 완벽하게 해결하는 기사를 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리고자 합니다. 편집기를 따라 살펴보겠습니다
1. 기존 방식: 메모리에서 파일 내용 읽기
파일 줄을 읽는 표준 방법은 메모리에서 읽는 것입니다. Guava와 Apache Commons IO는 모두 빠른 방법을 제공합니다. 파일 라인 읽기는 다음과 같습니다.
Files.readLines(new File(path), Charsets.UTF_8); FileUtils.readLines(new File(path));
는 실제로 BufferedReader 또는 해당 하위 클래스 LineNumberReader를 사용하여 읽습니다.
기존 접근 방식의 문제점: 파일의 모든 행이 메모리에 저장된다는 점입니다. 파일이 충분히 크면 프로그램에서 곧 OutOfMemoryError 예외가 발생하게 됩니다.
문제 생각해보기: 일반적으로 파일의 모든 줄을 한 번에 메모리에 넣을 필요는 없습니다. 대신 파일의 각 줄만 순회한 다음 해당 처리를 수행하면 됩니다. 처리한 후 폐기하세요. 따라서 모든 행을 메모리에 저장하는 대신 행 반복을 통해 읽을 수 있습니다.
2. 대용량 파일 읽기 처리 방법
대용량 파일을 반복해서 읽지 않고 메모리 부족 없이 처리:
(1) 파일 스트리밍 방법: Scanner 클래스를 사용합니다. 파일의 내용을 한 줄씩 계속해서 읽습니다.
FileInputStream inputStream = null; Scanner sc = null; try { inputStream = new FileInputStream(path); sc = new Scanner(inputStream, UTF-8); while (sc.hasNextLine()) { String line = sc.nextLine(); // System.out.println(line); } }catch(IOException e){ logger.error(e); }finally { if (inputStream != null) { inputStream.close(); } if (sc != null) { sc.close(); } }
이 솔루션은 파일의 모든 줄을 반복하므로 각 줄에 대한 참조를 유지하지 않고도 처리할 수 있습니다. 간단히 말하면 메모리에 저장되지 않습니다!
(2) Apache Commons IO 스트림: Commons IO 라이브러리를 사용하여 구현하고, 라이브러리에서 제공하는 사용자 정의 LineIterator를 사용합니다.
LineIterator it = FileUtils.lineIterator(theFile, UTF-8); try { while (it.hasNext()) { String line = it.nextLine(); // do something with line } } finally { LineIterator.closeQuietly(it); }
이 솔루션은 전체 파일이 모두 메모리에 저장되지 않기 때문입니다 , 이는 또한 상당히 보수적인 메모리 소비를 초래합니다.
위 내용은 대용량 파일을 읽을 때 메모리 오버플로에 대한 Java 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!