2011-08-02 1 views
0

큰 파일 (40GB)을 압축 한 다음이를 아카이브에 저장하는 시스템으로 작업하고 있습니다.인덱싱 된 압축 라이브러리

현재 libz.a를 사용하여 C++로 파일을 압축하고 있지만 파일에서 데이터를 가져 오려면 모든 것을 추출해야합니다. 누구든지 원본 파일 위치의 인덱스를 저장할 수있는 압축 구성 요소 (가능하면 .NET 호환)를 알고 있으며, 전체 파일의 압축을 푸는 대신 필요한 부분을 찾으십니까?

예 : 나는 단지 위치 10-27 사이의 원본 파일에서 발생하는 파일에 필요한 데이터를 알고 있기 때문에, 내가 압축에 원본 파일 위치를지도 할 수있는 방법을 싶습니다

Original File  Compressed File 
10 - 27   => 2-5 
100-202   => 10-19 
.............. 
10230-102020 => 217-298 

파일 위치.

누구나이 기능을 제공 할 수있는 압축 라이브러리 또는 이와 유사한 도구를 알고 있습니까?

+1

여기 보이는 문제는 대부분의 압축 알고리즘이 이러한 기능을 지원하지 않는다는 것입니다. 왜냐하면 fe. 압축 해제 100-202에는 이전 데이터가 필요합니다. fe 경우 질문을 확장 해 주실 수 있습니까? 당신은 원본 파일의 어떤 부분을 미래에 압축을 풀 것인지 알고 있습니까? 그래서 당신은 90-220이 아닌 100-202를 감압 할 것이라고 확신합니까? 이게 내가 생각하는 데 도움이 될거야. –

답변

1

솔루션이 사용자의 요구 사항에 따라 다르기 때문에 이것이 도움이 될지 잘 모르겠습니다 만, 작업하고있는 프로젝트에서 비슷한 문제가있었습니다 (적어도 그렇게 생각합니다). 드라이브에 많은 텍스트 기사를 보관하고 무작위 방식으로 액세스하십시오. 압축해야하는 데이터의 크기 때문에.

이 데이터를 모두 압축하는 문제는 대부분의 알고리즘이 압축을 풀 때 이전 데이터에 의존한다는 것입니다. 예를 들어 인기있는 LZW 메서드는 압축 해제를 수행하는 동안 실행시 adictionary (데이터 압축 해제 방법에 대한 명령어)를 작성하므로 중간에서 스트림을 압축 해제하는 것은 불가능합니다. 그러나 이러한 메소드가 조정될 수 있다고 생각합니다.

해결 방법 데이터를 청크로 압축하는 것이 압축 비율을 낮추지 만 가장 잘 작동하는 것으로 나타났습니다. 우리 프로젝트에서는 각 기사가 1 개의 청크 였고 1 씩 1을 압축 한 다음 각 "청크"가 시작되는 색인 파일을 만들었습니다.이 경우에는 압축 풀기가 쉬웠습니다. 전체 스트림을 압축 해제하면됩니다. 내가 원했던 기사.

그래서, 내 파일이처럼 보였다 :

Index; compress(A1); compress(A2); compress(A3)

대신

compress(A1;A2;A3).

이러한 방식으로 데이터를 분할 할 수 없다면 인위적으로 청크를 분할 할 수 있습니다 (예 : 5MB 청크로 데이터 묶기). 따라서 7MB에서 13MB로 데이터를 읽어야하는 경우 청크 5-10과 10-15 만 압축을 풀 것입니다. 처럼 인덱스 파일은 다음 보일 것이다 :

0  -> 0 
5MB -> sizeof(compress 5MB) 
10MB -> sizeof(compress 5MB) + sizeof(compress next 5MB) 

이 솔루션의 문제는 약간 더 압축 비율을 제공한다는 것입니다. 덩어리가 작을수록 압축률이 떨어집니다.

다른 많은 파일을 가지고 있어도 하드 드라이브에 다른 파일을 가지고 있어야하는 것은 아닙니다. 파일 하나를 서로 압축 한 다음 파일을 시작할 때를 기억하십시오.

또한 http://dotnetzip.codeplex.com/은 압축에 사용할 수 있고 C#으로 작성된 zip 파일을 만드는 데 유용한 라이브러리입니다. 나에게 꽤 좋은 결과를 얻었고 데이터를 1 개의 zip 파일로 작성하여 작성된 기능을 사용하여 데이터를 여러 조각으로 나눌 수 있습니다.