2009-04-21 8 views
2

정말 간단한 압축 작업을 위해 프로젝트에서 MiniLZO를 사용하고 있습니다. 한 프로그램으로 압축하고 다른 프로그램으로 압축을 풀고 있습니다. 얼마나 많은 공간을 감압 버퍼에 할당할지 알고 싶습니다. 압축 해제 된 데이터가 얼마나 많은 공간을 차지하고 있는지를 선언하는 정수로 출력 파일에 주석을 달아야하는 번거 로움을 덜어 줄 수 있다면 공간을 너무 많이 할당하는 것이 좋습니다. 얼마나 많은 공간을 차지할 수 있을지 어떻게 알 수 있을까요?LZO 감압 버퍼 크기

몇 가지 고려 사항을 생각해 보면이 질문은 다음과 같이 요약됩니다. lzo1x 압축의 최대 압축률은 얼마입니까?

답변

4

압축기와 압축 해제기를 모두 제어하므로 입력을 고정 크기 블록으로 압축하는 것이 좋습니다. 나는 각 블록에 64킬로바이트까지 압축 내 응용 프로그램에서 다음 압축 된 블록과 압축 된 데이터 자체의 크기를 방출하기 때문에 압축 스트림은 실제로 압축 블록의 일련 다음과 같습니다

length_of_block_1 
block_1 
length_of_block_2 
block_2 
... 

압축 해 제기 그냥 읽고 각각의 압축 된 블록은 64KB 버퍼로 압축을 풀어 낸다. 왜냐하면 그 블록이 64KB 블록을 압축하여 생성되었다는 것을 알기 때문이다. 도움이

희망,

에릭 Melski

+0

이것은 좋은 제안이기도하지만 주석을 추가하고 있습니다. 정확히 피하려고했던 것입니다. 따라서, 나는 단지 하나의 블록에서 데이터를 압축 할 수 있으며 (이미 저장된 방식이므로) 블록 크기로 주석을 달 수 있습니다. – Benson

+0

출력에 * 압축 해제 * 크기를 저장하지 않으려 고 생각했습니다. 입력 블록이 항상 N 바이트보다 작지 않다면 어떤 종류의 end-of-block 마커를 저장하는 것을 피할 수는 없다고 생각합니다. 각 압축 된 스트림에는 정확하게 하나의 블록이 있으므로 구분 기호가 필요 없습니다. 또는 버퍼를 채울 때 압축 해제기를 확장하여 부분 결과와 "수행 할 작업"코드를 반환 할 수 있으므로 반복적으로 호출하여 전체 입력을 압축 해제 할 수 있습니다. –

+0

좋은 제안이지만, 압축 해제 된 버퍼의 크기를 저장하는 것이 그보다 간단 할 것이라고 생각합니다. 그래서, 내 질문에 대한 답변은 "그것을 극복하고 압축 해제 된 크기로 주석을 달아주세요"라고 생각합니다. – Benson

2

압축 해제 된 데이터의 최대 크기는 처음에 압축 한 데이터의 최대 크기와 분명히 동일합니다.

입력 크기에 상한값이있는 경우 사용할 수 있다고 생각하지만 일반적인 방법은 압축되지 않은 크기를 지정하는 압축 된 버퍼에 헤더를 추가하는 것입니다.

+0

감사합니다, 나는 명심하겠습니다. 슬프게도 최대 크기를 제어 할 수 없습니다. 이 작업을 안전하게 수행하려면 헤더를 추가해야 할 것 같습니다. – Benson