2011-11-02 2 views
1

알고리즘 알고리즘을 작성 중입니다. Java; 내 알고리즘을 사용하려면 대상 파일의 구조에 대한 정보가 많이 필요합니다.자바 처리 수십억 바이트

데이터를 수집 한 후 파일을 다시 읽어야합니다.< -하지만 나는 원하지 않습니다.

파일 다시 읽기 동안는 I 오히려 고유 포맷 파일의 데이터를 '변환'의해 압축좋은 대상 만든다. 그런 다음 압축합니다.

문제가 지금 :

  1. 내가 파일을 다시 읽기에 대한 새로운 FileInputStream의를 열고 싶지 않아요.
  2. 보통 대상 파일의 크기의 150 % 인 변환 된 파일을 디스크에 저장하고 싶지 않습니다.

에 어떤 방법이 있습니까 파일,의 시작 부분으로 이동 에 대한 FileInputStream 객체를 '리셋'어떻게 내가 엄청난 양의 데이터 효율적으로 디스크에 기록하지 않고 '변환'저장 것인가?

답변

4

하나 이상의 RandomAccessFiles를 사용할 수 있습니다. 힙을 소비하지 않는 ByteBuffer()에 맵핑하거나 (실제로 약 128 바이트를 사용함) 직접 메모리를 무작위로 액세스 할 수 있습니다.

임시 데이터를 직접 ByteBuffer (s) 이상의 메모리 매핑 파일에 저장할 수 있습니다. 원본 데이터에 임의로 액세스 할 수 있으므로 생각만큼 메모리에 많은 데이터를 복제 할 필요가 없습니다.

이렇게하면 몇 KB의 힙만으로 전체 데이터에 액세스 할 수 있습니다.

+0

+1; 더 나은 대답. –

0

reset 방법이 있지만 BufferedInputStreamFileInputStream을 입력해야합니다.

+0

'reset()'은 mark()와 reset()을 호출 할 때 모든 데이터를 버퍼링해야합니다. –

+0

@PeterLawrey 예, 게시 한 후 깨달았습니다. 삭제됩니다. –

+0

나는 그 좋은 해결책이라고 생각한다. 단지 여기서 잘 작동하지 않을 것이다. –

0

RandomAccessFile 또는 java.nio를 사용할 수 있습니다. ByteBuffer는 사용자가 찾고있는 것입니다. (나도 몰라)

리소스는 파이프/스트림으로 저장 될 수 있습니다. 즉, 압축 된 스트림에 즉시 기록 할 수 있습니다.

에 대한 질문에 대답하려면 : 불가능합니다. 기본 클래스 InputStream에는 mark 및 reset-to-mark에 대한 규정이 있지만 FileInputStream은 여러 운영 체제에 대해 최적으로 만들어졌으며 순수 순차 입력을 수행합니다. 닫고 여는 것이 가장 좋습니다.

+0

파일 입력을 버퍼링 된 입력으로 감싸는 것이 그 방법입니다. 그러나이 경우에는 적절하지 않습니다. –