12

gzip으로 압축 된 파일에 임의 액세스 할 수 있기를 바랍니다. 전처리 결과가 파일 자체보다 훨씬 작다면 사전 처리 (예 : 일종의 색인 작성)를 할 여유가 있습니다.랜덤 액세스 gzip 스트림

어떤 조언이 필요합니까?

내 생각과 같다 : 기존 GZIP 구현에

  • 해킹 및 압축 된 데이터의 모든 말하자면, 1메가바이트의 압축 상태를 직렬화. 그런 다음 무작위 액세스를 수행하려면 압축 해제 상태를 deserialize하고 메가 바이트 경계에서 읽습니다. 이것은 특히 Java로 작업 중이므로 순수한 gzip 구현을 찾을 수 없기 때문에 힘들어 보입니다. (
  • 1Mb 청크로 파일을 다시 압축하고 이중화의 단점이 있습니다. 필요한 디스크 공간
  • 압축 해제를 수행하지 않고 블록 경계 만 탐지하고 색인화하는 gzip 형식의 간단한 구문 분석기를 작성하십시오 (아직 블록이 없으면 gzip 형식 설명을 읽지 않았습니다)

답변

6

는보고 at this link (C 코드 예제)가 있습니다.

/* zran.c -- example of zlib/gzip stream indexing and random access 
... 

Gzip은 봉투가있는 zlib입니다.

+0

감사에서 봐 가지고, 그 멋지다! – jkff

+1

@jkff : 교차 플랫폼 배포가 필요하지 않은 경우 JNA를 확인하십시오. 놀랍게도 C 라이브러리를 호출하는 방법으로 사용하기가 쉽습니다. –

+0

다시 한번 감사드립니다. 나는 그렇게했고 매력처럼 작동합니다!Rex, 너 덕분에, 나는 JNA를 사용했다. :) – jkff

0

흥미로운 질문입니다. 두 번째 옵션 (청크로 파일 재 압축)이 왜 디스크 공간을 두 배로 늘리는 지 이해할 수 없습니다. 저도 같을 겁니다. 오버 헤드가 적습니다. 압축 조각을 제어 할 수 있다면 올바른 생각 인 것 같습니다.

어쩌면 입력을 제어 할 수 없기 때문에 두 배가 될 수도 있습니다.

당신이 할 수 있다면, 나는 그것을 1GB의 일련의 1 기가 바이트 모양 인 일련의 백킹 스토어로 사용하는 CompressedFileStream 클래스로 모델링한다고 상상하고 있습니다. 읽을 때 스트림의 Seek()는 적절한 BLOB로 이동하고 압축을 해제합니다. BLOB 끝을 지난 Read()는 스트림이 다음 BLOB를 열도록합니다.

ps : GZIP는 IETF RFC 1952에 설명되어 있지만 압축 형식은 DEFLATE입니다. 이 CompressedFileStream 클래스를 상상 한 것처럼 구현하면 GZIP 정교함을 사용할 이유가 없습니다.

+0

원본 파일을 삭제하지 않기 때문에 두 번째 옵션이 마음에 들지 않으며 생성 방법을 제어 할 수 없습니다. 그러나 지금은 실제로 (내가 설명한대로) 실제로 구현 한 방법이지만 만족스럽지 않고 그 질문에 대한 이유입니다. – jkff

3

BGZF GZIP와 호환되는 파일 형식은 생물 학자에 의해 개발되었습니다.

(...) 위에 종래 GZIP BGZF의 장점 BGZF이 모색되고 위치까지 전체 파일을 스캔 없이 찾는 것이 가능하다.

http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/에서

이 BlockCompressedOutputStream 및 BlockCompressedInputStream.java

+2

고마워요,하지만 제 도구가 필요합니다. 기존 로그 파일이며 일반적으로 타사 아카이버가 .zip 또는 .gzip 형식으로 보관합니다. 게다가, 나는 이미 작업 솔루션을 가지고있다 :) – jkff