Nén các tệp tương tự một cách hiệu quả


11

Tôi thường xuyên có nhu cầu nén các tệp rất giống nhau.

Hiện tại tôi sử dụng 7Zip, nén tệp 16 GB xuống còn 1,2 GB trong khoảng 35 phút bằng 8 lõi với cài đặt Ultra.

Dường như với tôi rằng phần lớn thời gian đó được dành cho việc tính toán từ điển để sử dụng để nén. Vì các tệp rất giống nhau, nên từ điển thực sự được sử dụng cũng có khả năng tương tự.

Có một công cụ nén dựa trên Windows (7Zip với tùy chọn mà tôi không biết hoặc một công cụ khác) có thể lưu từ điển và sử dụng lại từ điển đã lưu cho các tệp tiếp theo không?

Có cách nào tốt hơn để tiếp cận vấn đề duy trì tỷ lệ nén tương tự như những gì tôi có, trong khi nén nhanh hơn đáng kể?

Câu trả lời:


5

Các LZW (LZW) nén thuật toán vốn đã tính toán chuyên sâu, với phần lớn các công việc riêng của mình là thực sự tính toán từ điển. Đây thực sự chỉ là cách LZW hoạt động.

Thuật toán tự thêm một mục từ điển mới cho mỗi "biểu tượng" tiếp theo mà nó quét, và do đó trong mỗi lần lặp duy nhất, một mục nhập mới được thêm vào từ điển. Trong thực tế, từ điển trở thành bản sao nén của tệp, và do đó thực sự là điều duy nhất mà nén LZW dành bất kỳ thời gian tính toán đáng kể nào ở vị trí đầu tiên.


Nếu bạn đã sử dụng một cái gì đó như mã hóa Huffman , thì việc sử dụng lại từ điển sẽ thực sự có thể (với chi phí của tốc độ / kích thước nén tối ưu có thể phụ). Tuy nhiên, hầu hết các thuật toán & công cụ nén hiện đại sử dụng thuật toán LZW về hiệu quả và tốc độ (nén Huffman sẽ yêu cầu hai lần truyền dữ liệu [một để tạo cây / bảng Huffman, một công cụ khác để thực sự nén dữ liệu], trong khi LZW có thể được hoàn thành trong một lượt duy nhất).


1
Với Huffman và một từ điển được xác định trước, chỉ cần một lần vượt qua? Có công cụ dựa trên Huffman nào sẵn có hỗ trợ từ điển đã lưu không?
Eric J.

@EricJ. vâng, với một từ điển được xác định trước, nó sẽ là mã hóa một lần. Tôi không biết bất kỳ phần mềm nào có thể làm được điều này, mặc dù tôi đã tự mình viết các chương trình làm việc đó. Trong khi tôi chưa thử nó, công cụ này có vẻ như có thể làm điều đó. Tuy nhiên, chỉ cần lưu ý rằng (một lần nữa, không giống như LZW) để giải mã dòng bit được mã hóa Huffman, bạn vẫn cần từ điển gốc để giải nén dữ liệu.
Đột phá

Dựa trên tuổi của công cụ đó, tôi đoán nó là đơn luồng. Tôi đoán sử dụng 1 lõi thay vì 8 sẽ bù bất kỳ lợi ích nào cho một từ điển cố định :-( Có sẵn từ điển ở đầu bên kia là khả thi trong kịch bản của tôi (chuyển các tệp lớn giữa các trung tâm dữ liệu).
Eric J.

2

Không giống như thuật toán DEFLATE, LZMA của 7-Zip sử dụng nén rắn theo mặc định, lợi dụng tính dự phòng giữa các tệp. Điều này sẽ hoạt động với các cài đặt mặc định miễn là các tệp đủ nhỏ.

Với cài đặt mặc định là 2 GB cho kích thước Khối rắn , một tệp 16 GB thực sự được nén thành 8 khối riêng biệt.

Như @Breakthorugh đã nói, từ điển được tạo ra một cách nhanh chóng. Bạn có thể xác minh điều này theo kinh nghiệm bằng cách thiết lập kích thước khối rắn để rắn (nén tất cả các file cùng một lúc) và Non-rắn (nén từng file riêng).

Việc tăng kích thước Khối rắn thực sự sẽ dẫn đến chậm, nhưng nó có thể dẫn đến tỷ lệ nén tốt hơn nhiều. Ví dụ, nén hai tệp giống nhau sẽ dẫn đến một kho lưu trữ lớn gần gấp đôi với nén không rắn.


1
Trong trường hợp của tôi, tôi nén từng tệp tương tự một lần, vào các dịp khác nhau. Chỉ có một tệp 16GB-ish trong một kho lưu trữ nhất định.
Eric J.

À, được rồi Tôi giải thích sai điều đó. Các tài liệu lưu trữ cũ có bị xóa khi cái mới được tạo không? Nếu không, có thể lưu trữ một số tệp trong một tệp lưu trữ không? Điều đó sẽ không giúp ích gì cho tốc độ nén, nhưng tùy thuộc vào mức độ tương tự của các tệp, nó có thể giúp với tỷ lệ.
Dennis

1
Không bao giờ, nó không. Cập nhật một kho lưu trữ rắn mất nhiều thời gian hơn, nhưng nó không dẫn đến nén tốt hơn.
Dennis
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.