문제

Java의 GZIP 형식으로 약 8000 파일을 압축하려고합니다. 첫 번째 시도는 gzipinputstream을 사용하는 것이었지만 성능은 끔찍했습니다.

누가 GZIP 아카이브를 압축 해제하는 대안을 알고 있습니까? ZipInputStream을 시도했지만 GZIP 형식을 인식하지 못합니다.

미리 감사드립니다.

도움이 되었습니까?

해결책

버퍼링을 사용해야합니다. 작은 데이터를 작성하는 것은 비효율적입니다. 압축 구현은 SUN JDK의 기본 코드입니다. 버퍼링 된 성능이 아니더라도 일반적으로 합리적인 파일 또는 네트워크 I/O를 초과해야합니다.

OutputStream out = new BufferedOutputStream(new GZIPOutputStream(rawOut));

InputStream in = new BufferedInputStream(new GZIPInputStream(rawIn));

기본 코드는 감압/압축 알고리즘을 구현하는 데 사용되므로 사용 후 스트림 (기본 스트림뿐만 아니라)을 닫는 데 매우주의하십시오. 나는`deflaters '가 많이있는 것을 발견했습니다. 매우 성능에 좋지 않습니다.

ZipInputStream 스트림 압축과는 완전히 다른 파일 아카이브를 처리합니다.

다른 팁

당신이 그렇게 말할 때 GZipInputStream의 공연은 끔찍했습니다. 더 구체적 일 수 있습니까? 그것이 CPU 병목 현상인지 또는 I/O 병목 현상인지 여부를 알았습니까? 입력과 출력 모두에 버퍼링을 사용하고 있습니까? 사용중인 코드를 게시 할 수 있다면 매우 도움이 될 것입니다.

멀티 코어 머신에 있다면 여전히 사용해 볼 수 있습니다. GZipInputStream 그러나 코어 당 하나의 여러 스레드를 사용하여 공유 파일 대기열이 여전히 처리됩니다. (하나의 파일은 단일 스레드로 만 처리됩니다.) ~할 것 같다 당신이 I/O 묶인 경우 상황을 악화 시키지만 시도해 볼 가치가있을 수 있습니다.

이러한 종류의 규모의 경우 플랫폼 요구 사항이 제한되어 있다고 가정하면 기본으로 가고 싶을 수도 있습니다. JNI를 사용하여 라이브러리를 호출하거나 사용하여 기본 명령을 호출 할 수 있습니다. ProcessBuilder.

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