2008-10-14 27 views
6

tôi sử dụng mã này để tạo ra một .zip với một danh sách các tập tin:Kích thước bộ đệm để tạo tệp nén .zip bằng Java là gì?

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(); 

Tôi không biết làm thế nào các thuật toán nén và ZipOutputStream hoạt động, nếu nó viết cái gì đó trước khi tôi đọc và gửi cho 'ZOS 'tất cả dữ liệu, tệp kết quả có thể khác về kích thước byte so với nếu tôi chọn kích thước bộ đệm khác.

nói cách khác tôi không biết nếu các thuật toán cũng giống như:

đọc dữ liệu -> xử lý dữ liệu -> CREATE ZIP

hoặc

READ đoạn DATA-- > QUY TRÌNH CHỮ BIẾN DỮ LIỆU CHỮ KÝ -> CHỮ NHẠC VIẾT TRONG .ZIP -> | ^ ------------------------------------------------ -------------------------------------------------- ---------------------------

Nếu trường hợp này xảy ra, kích thước bộ đệm nào là tốt nhất?

Cập nhật:

Tôi đã kiểm tra mã này, thay đổi kích thước bộ đệm 1024-64, và nén các tập tin giống nhau: với 1024 byte file kết quả 80 KB là 3 byte nhỏ hơn với 64 byte đệm. Kích thước bộ đệm nào tốt nhất để tạo ra tệp .zip nhỏ nhất trong thời gian khó khăn nhất?

Trả lời

10

Câu trả lời ngắn: Tôi sẽ chọn thứ gì đó như 16k.


Long trả lời:

ZIP đang sử dụng các thuật toán Deflate cho nén (http://en.wikipedia.org/wiki/DEFLATE). Deflate là một hương vị của Ziv Lempel Welch (tìm kiếm wikipedia cho LZW). DEFLATE sử dụng mã hóa LZ77 và Huffman.

Đây là nén từ điển và theo như tôi biết từ quan điểm thuật toán, kích thước bộ đệm được sử dụng khi cho dữ liệu vào dấu gạch ngang sẽ hầu như không có tác động. Tác động lớn nhất đối với LZ77 là kích thước từ điển và cửa sổ trượt, không được kiểm soát bởi kích thước bộ đệm trong ví dụ của bạn.

Tôi nghĩ bạn có thể thử nghiệm với các kích thước bộ đệm khác nhau nếu bạn muốn vẽ đồ thị, nhưng tôi chắc chắn bạn sẽ không thấy bất kỳ thay đổi đáng kể nào về tỷ lệ nén (3/80000 = 0,00375%).

Tác động lớn nhất của kích thước bộ đệm là tốc độ do số lượng mã trên không được thực thi khi bạn thực hiện cuộc gọi đến FileInputStream.read và zos.write. Từ quan điểm này, bạn nên tính đến những gì bạn đạt được và số tiền bạn chi tiêu.

Khi tăng từ 1 byte lên 1024 byte, bạn mất 1023 byte (theo lý thuyết) và bạn thu được giảm ~ 1024 thời gian trên không trong các phương thức .read và .write. Tuy nhiên, khi tăng từ 1k lên 64k, bạn đang tiêu 63k để giảm 64 lần.

Vì vậy, điều này đi kèm với lợi nhuận giảm dần, do đó tôi sẽ chọn một nơi nào đó ở giữa (giả sử 16k) và gắn bó với điều đó.

+0

Tôi chấp nhận câu trả lời này vì nó cho thấy kích thước bộ đệm không ảnh hưởng đến kích thước kết quả có ý nghĩa nhưng kích thước từ điển và cửa sổ trượt – Telcontar

0

Phụ thuộc vào phần cứng bạn có (tốc độ ổ đĩa và thời gian tìm kiếm tệp). Tôi sẽ nói nếu bạn không quan tâm đến việc ép giảm hiệu suất cuối cùng, hãy chọn bất kỳ kích thước nào từ 4k đến 64k. Vì nó là một đối tượng ngắn ngủi nên nó sẽ được thu thập nhanh chóng.

Các vấn đề liên quan