2010-07-25 8 views
14

file.txt.gz에 2GB가 있다고 가정 해 봅시다. 마지막으로 100 줄 정도를보고 싶습니다. zcat <file.txt.gz | tail -n 100은이 모든 것을 처리합니다.gzipped 텍스트 파일의 마지막 줄 읽기

나는 압축 파일에 무작위로 액세스 할 수 없다는 것을 알고 있으며, 마지막 5MB를 잘라 내면 잘라낸 직후의 데이터가 가비지가 될 것이지만 나머지는 다시 동기화하고 나머지는 디코딩 할 수 있습니까?

정확하게 이해한다면 gzip 스트림은 출력 할 내용을 설명하는 간단한 명령 스트림입니다. 동기화 할 수 있어야합니다. 그렇다면 가장 최근의 압축되지 않은 데이터의 슬라이딩 윈도우가 32kB입니다. 중간에서 시작한다면 물론 쓰레기로 시작하지만, 보통은 실제 데이터로 빠르게 채워질 것이라고 추측 할 수 있습니다. 그 시점부터 감압은 쉽지 않습니다. 파일이 시작될 때부터 끝까지 다시 무언가가 복제 될 수 있으므로 슬라이딩 윈도우가 지워지지 않을 수 있습니다. 모든 것이 공통적 인 경우라면 놀라실 것입니다. 그런 일이 발생하면 전체 파일을 처리합니다.

나는 gzip 해커의 이런 일을 정말로 열망하지 않습니다. 이전에는 아무도하지 않았으며, 손상된 파일을 다루는 사람은 없었습니까?

다른 방법으로 gzip에서 실제로 그렇게 할 수없는 경우 중간 스트림을 다시 동기화 할 수 있다는 점을 제외하고 gzip으로는 거의 불가능한 다른 스트림 압축 프로그램이 있습니까?

편집 : pure Ruby reimplementation of zlib을 발견하고 슬라이딩 윈도우 내에서 여러 바이트의 바이트를 인쇄하도록 해킹당했습니다. 일들이 계속 반복해서 복사되고 심지어 5MB + 슬라이딩 윈도우에도 여전히 처음 100 바이트의 내용이 포함되어 있고 파일 전체의 임의의 위치에서 나온 것들이 포함되어 있습니다.

첫 번째 바이트는 직접 참조되지 않으므로 처음 몇 블록과 마지막 몇 블록을 읽음으로써 그 문제를 해결할 수는 없습니다. 단지 사본의 길이가 길고 참조하는 것이 무엇인지 알아낼 수있는 유일한 방법입니다. 모든 것을 처리하는 것입니다.

기본적으로 기본 옵션을 사용하면 원했던 것이 불가능할 수 있습니다.

한편 zlib에는 동기화를 위해이 슬라이딩 창을 지우는 Z_FULL_FLUSH 옵션이 있습니다. 그래서 문제는 여전히 남아 있습니다. zlib가 매시간 동기화된다고 가정하고, 모든 것을 처리하지 않고 zlib을 끝까지 읽는 도구가 있습니까?

+0

중복 질문보기 http://stackoverflow.com/questions/14225751/random-access-to-gzipped-files and zran http://www.zlib.net/zlib_faq.html#faq28 –

+1

그 질문은 실제로 가지고 있습니다. 내 문제와 관련이 없으며,'Z_FULL_FLUSH'는 진짜 해결책이었습니다. – taw

+0

쿨! 솔루션을 게시 할 수 있습니까? –

답변

1

Z_FULL_FLUSH는 동기화에 사용할 수있는 알려진 바이트 시퀀스 (00 00 FF FF)를 내 보냅니다. This link이 유용 할 수 있습니다.

+6

링크가 죽었습니다 ... – stepancheg

0

이것은 블록 암호와 스트림 암호의 차이점입니다. gzip은 스트림 암호이므로 해당 지점의 바이트를 해독하기 위해 전체 파일을 특정 지점까지 필요로 할 수 있습니다.

언급했듯이 창을 지우면 황금이됩니다. 그러나 zlib가 실제로이 작업을 충분히 자주 수행한다는 보장이 없습니다 ... 파일 끝에서 뒤로 탐색하여 전체 플러시 표시를 찾는 것이 좋습니다.

관련 문제