2012-10-27 4 views
4

파일을 메인 메모리에로드하는 방법은 무엇입니까? 파일 읽기와 처리를 위해 파일을 디스크에서 메인 메모리로로드하는 방법

은 내가
BufferReader buf = new BufferedReader(FileReader()); 

나는이 디스크에서 라인으로 파일 라인을 읽는 것을 가정

를 사용 을 사용하여 파일을 읽습니다. 이것의 장점은 무엇입니까?

파일을 메모리에 직접로드 할 때의 이점은 무엇입니까? Java로 어떻게 할 수 있습니까?

Scanner 또는 RandomAccessFile 방법에 몇 가지 예가 있습니다. 파일을 메모리에로드합니까? 나는 그들을 사용해야합니까? 두 가지 중 어느 것을 사용해야합니까?

미리 감사드립니다.

+2

[프로파일 러] (http://stackoverflow.com/q/2064427/230513)는 뭐라고 말합니까? – trashgod

+0

힙이 어디 있다고 생각합니까? ("파일을 메모리로로드"는 의미없는 표현입니다.) –

+0

프로파일 러가 없습니다. hadoop 클러스터에서 프로그램을 실행하고 cygwin을 사용하여 모니터합니다. 나는 파일을 디스크에서 한 줄씩 읽지 않고 메모리에 직접로드하는 방법을 원한다. 제 생각에 힙은 동적 인 메모리 할당입니다. 그렇다고해서 나는 그것에 대해 생각하지 않습니다. pls 도움! –

답변

7
BufferReader buf = new BufferedReader(FileReader()); 

나는이 디스크에서 라인으로 파일 라인을 읽는 것으로 추정. 이것의 장점은 무엇입니까?

정확하게는 아닙니다. 크기가 기본 버퍼 크기 인 청크로 파일을 읽는 것입니다 (8k 바이트라고 생각합니다).

거대한 파일을 읽는 데 거대한 힙이 필요하지 않은 점이 장점입니다. 최대 힙 크기는 JVM 시작시에만 지정 될 수 있으므로 (핫스팟 Java 사용) 중요한 문제입니다.

거대한 힙을 나타 내기 위해 시스템의 실제/가상 메모리 리소스를 사용하지 마십시오.

파일을 메모리에 직접로드 할 때의 이점은 무엇입니까?

시스템 호출 횟수가 줄어들어 일 수 있습니다. 파일을 더 빨리 읽을 수 있습니다. 얼마나 빨라지 는가는 여러 요소에 달려 있습니다. 그리고 정말로 큰 파일을 다루는 문제가 있습니다.

어떻게 Java로 작성합니까?

  1. 파일 크기를 알아보십시오.
  2. 충분히 큰 바이트 (또는 문자) 배열을 할당하십시오.
  3. read(byte[], int, int) 또는 read(char[], int, int) 메서드를 사용하여 전체 파일을 읽습니다.

메모리 매핑 된 파일을 사용할 수도 있지만 사용하려면 약간 까다로울 수있는 Buffer 개의 API를 사용해야합니다.

Scanner 또는 RandomAccessFile 메소드에 몇 가지 예가 있습니다. 파일을 메모리에로드합니까?

아니요, 아니요.

사용해야합니까? 두 가지 중 어느 것을 사용해야합니까?

그들은 필요한 기능을 제공합니까? 텍스트 기반 데이터를 읽거나 구문 분석해야합니까? 바이너리 데이터에 무작위로 액세스해야합니까?

정상적인 상황에서는 주로 필요한 기능과 성능 측면에서 2 차적으로 기반으로 I/O API를 선택해야합니다. BufferedInputStream 또는 BufferedReader을 사용하면 읽는 동안 구문 분석하려는 경우 일반적으로 허용되는 * 성능을 얻는 데 충분합니다. (실제로 원래의 형태로 메모리에 전체 파일을 유지해야하는 경우에, 다음 BufferedXxx 래퍼 클래스는 실제로 약간 느리게 읽기 수 있습니다.)


는 * - 허용 성능은하지 않습니다 최적의 성능과 같지만 클라이언트/프로젝트 관리자는 아마 명시 적 요구 사항이 아닌 경우 최적의 성능을 발휘하기 위해 시간을 낭비하기를 원하지 않을 것입니다.

+0

파일을 읽고 구문 분석해야합니다. 나는 hadoop map reduce 프로그램을 위해 이것을 즐겁게한다. 버퍼링 된 판독기를 사용하여 디스크에서 파일을 읽으려고합니다. 그러나 이것은 많은 시간이 걸리는 것으로 보입니다. 그래서, 전체 파일을 메모리에로드하여 성능을 향상시킬 수 있는지 궁금합니다. –

+0

응용 프로그램의 프로필을 작성하여 읽기/파싱에 소요되는 시간을 정확하게 파악해야합니다. –

+1

파싱하지 않고 전체 파일을 읽으려는 의도가있는 경우 Buffered 래퍼는 작업에 추가 복사본 만 추가합니다. 그러나 파일을 읽고 파싱 한 다음 파일을 다시 참조하지 않으면 버퍼링 된 리더를 원하고 전체 파일을 한 번에 읽는 것이 좋지 않을 수 있습니다. –

3

파일을 읽은 다음 구문 분석하여 처음부터 끝까지 한 번 훑어 데이터를 추출한 다음 다시 파일을 참조하지 않으면 버퍼링 된 판독기가 "최적"상태로 유지됩니다. . 버퍼 크기를 조정하여 성능을 어느 정도 "조정"할 수 있습니다. 큰 버퍼는 파일에서 더 큰 청크를 읽습니다. (버퍼를 2의 거듭 제곱으로 만드십시오 - 예를 들어 262144) 큰 파일 전체 (1MB보다 큼)에서 읽는 것은 일반적으로 페이징 및 힙 관리 성능을 저하시킵니다.

+0

감사합니다. 시도해보십시오! –

관련 문제