>  기사  >  Java  >  대용량 파일을 읽을 때 메모리 오버플로에 대한 Java 솔루션

대용량 파일을 읽을 때 메모리 오버플로에 대한 Java 솔루션

黄舟
黄舟원래의
2017-08-10 09:21:332510검색

다음 편집기는 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.