Java를 사용하여 .zip 아카이브를 만들기위한 버퍼 크기는 얼마입니까?

StackOverflow https://stackoverflow.com/questions/200752

  •  03-07-2019
  •  | 
  •  

문제

이 코드를 사용하여 파일 목록이있는 .zip을 작성합니다.

ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));

for (int i=0;i<srcFiles.length;i++){
    String fileName=srcFiles[i].getName();
    ZipEntry zipEntry = new ZipEntry(fileName);
    zos.putNextEntry(zipEntry);
    InputStream fis = new FileInputStream(srcFiles[i]);
    int read;
    for(byte[] buffer=new byte[1024];(read=fis.read(buffer))>0;){
        zos.write(buffer,0,read);
    }
    fis.close();
    zos.closeEntry();
}
zos.close();

ZIP 알고리즘과 ZipOutputStream이 어떻게 작동하는지 모르겠습니다. 읽기 전에 무언가를 작성하고 'ZOS'로 보내는 모든 데이터가 다른 버퍼 크기를 선택하는 것과는 바이트 크기가 다를 수 있습니다.

즉, 알고리즘이 어떤지 모르겠습니다.

데이터 읽기-> 프로세스 데이터-> 작성 .zip 작성

또는

데이터 청크 읽기-> 데이터 청크-> chunk in .zip-> | ^--------------------------------------------------------------- ----------------------------------------------------------- -----------------------------

이 경우 어떤 버퍼 크기가 가장 좋습니까?

업데이트:

이 코드를 테스트하고 버퍼 크기를 1024에서 64로 변경하고 동일한 파일을 zpip습니다. 가장 뚱뚱한 시간에 가장 작은 .zip을 생산하기에 가장 적합한 버퍼 크기는 무엇입니까?

도움이 되었습니까?

해결책

짧은 대답 : 나는 16k와 같은 것을 선택합니다.


긴 답변 :

Zip은 Deflate 알고리즘을 사용하여 압축을 사용합니다.http://en.wikipedia.org/wiki/deflate). Deflate는 Ziv Lempel Welch (LZW의 Wikipedia 검색)의 맛입니다. Deflate는 LZ77 및 Huffman Coding을 사용합니다.

이것은 사전 압축이며, 알고리즘 관점에서 알 수있는 한, 디플레이터에 데이터를 공급할 때 사용 된 버퍼 크기는 거의 영향을 미치지 않아야합니다. LZ77의 가장 큰 영향은 사전 크기 및 슬라이딩 창으로, 예제의 버퍼 크기에 의해 제어되지 않습니다.

원하는 경우 다른 버퍼 크기로 실험 할 수 있다고 생각하고 그래프를 플로팅 할 수 있지만 압축 비율 (3/80000 = 0.00375%)이 크게 변경되지 않을 것이라고 확신합니다.

버퍼 크기가 미치는 가장 큰 영향은 FileInputStream.Read 및 Zos.Write를 호출 할 때 실행되는 오버 헤드 코드의 양으로 인해 속도에 있습니다. 이 관점에서 당신은 당신이 얻는 것과 당신이 지출하는 것을 고려해야합니다.

1 바이트에서 1024 바이트로 증가하면 1023 바이트 (이론적으로)를 잃고. 읽기 및 .write 메소드에서 오버 헤드 시간을 ~ 1024로 줄입니다. 그러나 1K에서 64K로 증가하면 63K를 소비하여 오버 헤드를 64 배 줄입니다.

따라서 이것은 수익이 줄어든다. 따라서 나는 중간 어딘가에 (16k) 어딘가에 선택하고 그것을 고수 할 것이다.

다른 팁

가지고있는 하드웨어 (디스크 속도 및 파일 검색 시간)에 따라 다릅니다. 마지막 성능 낙하를 짜는 데 관심이 없다면 4K에서 64K 사이의 크기를 짜는 데 관심이 없다면 말할 것입니다. 짧은 개체이므로 어쨌든 빠르게 수집됩니다.

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