2014-05-15 10 views
3

.gz 파일로 저장되는 이미지 작업 (내 이미지 처리 소프트웨어는 디스크 시간/공간을 줄이거 나 .gz 파일을 읽을 수 있음) 각 파일의 헤더를 확인해야합니다.부분 감압 가능합니까?

헤더는 각 이미지의 시작 부분에 고정 크기의 작은 구조체이며 압축되지 않은 이미지의 경우 매우 빠르게 검사됩니다. 압축 된 이미지를 읽으려는 경우, 전체 파일의 압축을 풀고이 헤더를 확인하는 것이 선택의 여지가 있습니다. 물론이 과정을 통해 프로그램이 느려집니다.

.gz 파일의 첫 번째 세그먼트 (예 : 몇 K)를 읽고이 세그먼트의 압축을 풀고 원본 콘텐츠를 읽을 수 있습니까? gz에 대한 나의 이해는 시작 시점의 일부 부기 후에 압축 된 데이터가 순차적으로 저장된다는 것입니다.

그래서 대신
1. 큰 파일 F
2. 압축 해제 큰 파일 F
3.
4. 큰 파일 F


을 재 압축 500 바이트 헤더를 읽을 수 1. 대용량 파일 열기 F
2. 에서 처음으로 5K를 읽습니다. 스트림으로 A
개 3. 압축 해제는 A 스트림으로 B
4. 내가 libz.so하지만 다른 언어 솔루션을 부탁드립니다 사용하고 B

에서 500 바이트의 헤더를 읽어!

답변

7

사용자는 예를 들어, 단지 제 10 킬로바이트의 압축을 gzip -cd file.gz | dd ibs=1024 count=10을 사용할 수

여기 PyTables 통해 파이썬 상이한 압축 알고리즘을 이용하여 판독 속도를 비교한다.

gzip -cd 표준 출력으로 압축이 풀립니다.

파이프 |dd에 있습니다.

dd 유틸리티는 표준 입력을 표준 출력에 복사합니다. 따라서 dd ibs=1024은 입력 블록 크기를 기본값 512 대신 1024 바이트로 설정합니다.

count=10 gzip 압축 풀기가 중지되므로 입력 블록이 10 개만 복사됩니다.

표준 512 블록 크기를 사용하여 gzip -cd file.gz | dd count=1을 사용하고 추가 12 바이트를 무시하려는 경우가 있습니다.

의견은 gzip -cd file.gz | head -c $((1024*10)) 또는이 특정 경우에 gzip -cd file.gz | head -c $(512)을 사용할 수 있다는 점을 강조합니다. 원래 dd이 1024에서 gzip 압축 해제에 의존한다는 의견은 사실로 보지 않습니다. 예를 들어 dd ibs=2 count=10은 처음 20 바이트의 압축을 풉니 다.

+1

이 방법으로'dd '를 사용하는 것은 [gzip으로 1024 바이트의 배수로 쓰는 것에 달려 있습니다] (https://unix.stackexchange.com/questions/415799/how-to-partially-extract-zipped-huge-plain) -text-file # comment746367_415808), 왜냐하면'dd '는 바이트 중심이 아닌 블록 지향적 ('read' 시스템 호출 횟수)이기 때문입니다. 더 쉽고 효율적인'head -c $ ((1024 * 10))'을 사용하라. 관련 [압축 된 거대한 일반 텍스트 파일을 부분 추출하는 방법?] (https://unix.stackexchange.com/questions/415799/how-to-partially-extract-zipped-huge-plain-text-file) –

2

예, 가능합니다.

그러나 바퀴를 재발 명하지 마십시오. HDF5 데이터베이스는 다른 압축 알고리즘 (gz 중 하나)을 지원하며 다른 부분을 처리 할 수 ​​있습니다. 그것은 Linux 및 Windows와 호환되며 많은 언어에 대한 래퍼가 있습니다. 또한 병렬로 읽기 및 압축 풀기를 지원하므로 높은 압축률을 사용하면 매우 유용합니다.

Plot

+0

감사 정보 및 확인을 위해! 제 질문은 좀 더 기본적인 내용입니다. 첫째, 나는 주어진 데이터와 다른 소프트웨어 (.gz에만 해당)를 사용해야합니다. 또한, 일부 압축 풀기가 적용/제공되는 HD5 페이지에서 볼 수 없었습니다. 그것이 내가 필요한 유일한 것입니다. HDF5는 매우 복잡한 제품처럼 보입니다. –

+0

데이터베이스에서 읽는 함수는 H5Dread이며'src/H5DIo.c'에 있습니다. 소스를 읽고 어떻게하는지 볼 수 있습니다. 그 이상으로, 나는 너를 도울 수 없어서 미안해. – Davidmh

0

A 수축되는 스트림은 연속적으로 여러 개의 블록을 가질 수 있습니다. 그러나 더 큰 블록의 일부인 경우에도 원하는 바이트 수만큼 압축을 풀 수 있습니다. zlib 함수 gzread은 길이 인수를 취하며 전체 스트림의 길이에 관계없이 특정 양의 일반 텍스트 바이트를 압축 해제하는 다양한 방법이 있습니다. 함수 목록 및 함수 사용 방법은 the zlib manual을 참조하십시오.

헤더 만 수정하려는 것은 분명하지 않습니다. (당신은 전체 파일을 다시 압축하는 것을 언급하지만, 옵션 B는 아무 것도 재 압축하지 않는다). 그렇다면 별도의 Deflate 블록에 헤더를 작성하여 나머지 이미지를 재 압축하지 않고 해당 블록을 교체 할 수 있습니다. zlib deflate 함수를 호출하여 헤더를 쓸 때 Z_FULL_FLUSH을 사용하십시오. 헤더의 압축 된 길이를 어디에서나 기록 할 필요는 없습니다. 대체 할 바이트를 파악하기 위해이를 읽을 때 계산할 수 있다고 생각합니다.

아무 것도 수정하지 않으면 전체 파일을 다시 압축하는 것이 바람직하지 않습니다. 찾고있는 헤더를 찾은 후 처음부터 압축 해제를 찾아 다시 시작할 수 있습니다.