문제

이것은 "실제로 실현 가능하지 않다"또는 "실제로 노력할 가치가 없다"는 영역에 속할 수 있지만 여기에 간다.

다중 부분 GZIP 파일 내에 저장된 레코드에 무작위로 액세스하려고합니다. 구체적으로, 내가 관심있는 파일은 압축되어 있습니다 HERETRIX 아크 파일. (다중 부위 GZIP 파일에 익숙하지 않은 경우 GZIP 사양을 통해 여러 GZIP 스트림을 단일 GZIP 파일로 연결할 수 있습니다. 사전 정보를 공유하지 않으므로 간단한 이진 부가입니다.)

파일 내의 특정 오프셋을 찾아서이를 수행 한 다음 GZIP Magic 헤더 바이트 (예 : 0x1f8b에 따라)를 스캔 할 수 있다고 생각합니다. RFC), 다음 바이트에서 GZIP 스트림을 읽으려고 시도하십시오. 이 접근법의 문제점은 동일한 바이트가 실제 데이터 내부에도 나타날 수 있으므로 바이트를 찾으면 GZIP 스트림을 읽기 시작하는 잘못된 위치로 이어질 수 있습니다. 레코드 오프셋이 선험적으로 알려져 있지 않다는 점을 감안할 때 무작위 액세스를 처리하는 더 좋은 방법이 있습니까?

도움이 되었습니까?

해결책

당신이 깨달은 바와 같이 GZIP의 디자인은 무작위 액세스에 친숙하지 않습니다.

설명대로 수행 할 수 있으며 감압제에서 오류가 발생하면 찾은 서명이 실제로 압축 된 데이터라고 결론을 내립니다.
압축 압축을 마치면 CRC32를 통해 방금 감압 된 스트림의 유효성을 쉽게 확인할 수 있습니다.

파일이 크지 않은 경우 모든 항목을 직렬로 제거하고 서명의 오프셋을 유지하여 디렉토리를 작성하는 것을 고려할 수 있습니다. 압축을 압축 할 때 바이트를 약간 버킷에 버립니다. 이 시점에서 디렉토리를 생성 한 다음 파일 이름, 날짜 또는 기타 메타 데이터를 기반으로 랜덤 액세스를 지원할 수 있습니다.

이것은 100k 미만의 파일의 경우 합리적으로 빠릅니다. 추측대로, 각각 약 100k의 10 개의 파일이 있다면 현대 CPU에서 2S에서 수행 될 것입니다. 이것이 제가 "꽤 빠른"의미입니다. 그러나 당신만이 당신의 응용 프로그램의 성능 요구 사항을 알고 있습니다.

gzipinputstream 클래스가 있습니까? 그렇다면 당신은 그곳에서 반쯤 있습니다.

다른 팁

그만큼 BGZF GZIP와 호환되는 파일 형식은 생물 학자들이 개발했습니다.

(...) 기존 GZIP보다 BGZF의 장점은 BGZF가 전체 파일을 통해 찾는 위치로 스캔하지 않고도 찾을 수 있다는 것입니다.

~ 안에 http://picard.svn.sourceforge.net/viewvc/picard/trunk/src/java/net/sf/samtools/util/ , BlockCompressedOutputStream 및 BlockCompressedInputStream.java를 살펴보십시오

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top