Hỗ trợ đa luồng trong 7za


18

(Tôi đã đăng bài này đầu tiên trên serverfault, nhưng sau đó tôi nhận ra nó có lẽ thuộc về nơi này.)

Tôi đang cố nén một tệp văn bản rất lớn bằng 7za (p7zip) 9.20. Tùy chọn -mmt dường như không có bất kỳ ảnh hưởng nào. Tôi đã thử cả -mmt = on và -mmt = 2. Đây là một máy 8 lõi. Một người đề nghị thêm -m0 = lzma2 làm đối số, nhưng điều đó chỉ mang lại cho tôi E_INVALIDARG. Có ai biết làm thế nào để làm việc này?

Điều này không có tác dụng:

7za a -mx=9 -mmt=2 -p myarchive.zip bigfile.txt

Và điều này không thành công với một lỗi:

7za a -m0=lzma2 -mx=9 -mmt=2 -p myarchive.zip bigfile.txt


7-Zip (A) [64] 9.20  Copyright (c) 1999-2010 Igor Pavlov  2010-11-18
p7zip Version 9.20 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,8 CPUs)
Scanning

Creating archive release_20120601-1-http.zip



System error:
E_INVALIDARG

Tôi tin rằng các tùy chọn chỉ đơn giản -mmt, không -mmt=2. Ngoài ra tôi tin rằng cú pháp thích hợp là -mx9, mặc dù cả hai có thể hoạt động.
Đột phá

Cảm ơn, nhưng -mmt không có tùy chọn vẫn chỉ sử dụng một luồng. Theo docs.ormsaco.com/7zip/MANUAL/switches/method.htm#ZipMultiThread , bạn có thể chỉ định số lượng chủ đề sẽ sử dụng với, -mmt = N.
Brian L

Tôi vẫn sẽ khuyên bạn nên sử dụng LZMA / Deflate mặc dù nó chỉ có một luồng. Mặc dù bạn có thể tăng tốc độ nén với BZip2, nhưng nó sẽ kém hiệu quả hơn khi nén văn bản đơn giản và các biến thể đơn luồng chậm hơn so với tương đương LZMA / Deflate.
Đột phá

@BreakENC: BZip2 thường đạt được độ nén tốt hơn DEFLATE, như được hiển thị trong liên kết của bạn. Nó cũng nhanh hơn nhiều so với LZMA (khi nén).
Dennis

Câu trả lời:


25

Theo công tắc -m (Đặt phương thức nén) # ZipMultiThread - Tài liệu & tài liệu hướng dẫn 7ZIP , mtmặc định on, do đó không cần phải chỉ định nó.

Tuy nhiên, việc triển khai thuật toán DEFLATE của 7zip không hỗ trợ đa luồng!

Như bạn đã khám phá,

7za a archive.zip bigfile

chỉ sử dụng một lõi.

Nhưng .ziptập tin nén từng tập tin riêng lẻ. Khi nén một số tệp, tùy chọn đa luồng sẽ nén một tệp cho mỗi lõi cùng một lúc.

Hãy thử nó và bạn sẽ thấy rằng

7za a archive.zip bigfile1 ... bigfileN

sẽ sử dụng tất cả các Nlõi có sẵn .

Nếu bạn muốn tăng tốc độ nén của một đơn tập tin, bạn có hai lựa chọn:

  1. Chia ra thành bigfiletừng khúc.

  2. Sử dụng một thuật toán nén khác nhau.

    Ví dụ, việc triển khai thuật toán BZip2 của 7zip hỗ trợ đa luồng.

    Cú pháp là:

    7za a -mm=BZip2 archive.zip bigfile
    

Ngoài ra, lỗi cú pháp là do bạn cố gắng sử dụng Thuật toán LZM cho một vùng .zipchứa. Đó là không thể.

Các thuật toán có thể cho .zipconatiners là DEFLATE (64), BZip2 và không nén.

Nếu bạn muốn sử dụng Thuật toán LZM, hãy sử dụng một .7zthùng chứa. Container này cũng xử lý các thuật toán sau: PPMd, BZip2, DEFLATE, BCJ, BCJ2 và không nén.


@Dennis Tôi nghĩ rằng OP đã sử dụng LZMA (2), từ tài liệu này, "nén LZMA chỉ sử dụng 2 luồng." Mặc dù tôi đồng ý, theo trực giác (do cách mã hóa Lempel-Ziv hoạt động), sẽ rất khó để đa luồng LZMA hoặc Deflate (chỉ là LZMA với mã hóa Huffman).
Đột phá

1
@BreakENC: Lúc đầu, tôi cũng vậy (Kiểm tra bản sửa đổi câu trả lời của tôi.) Đó là lỗi cú pháp. Bạn không thể sử dụng nén LZMA với một .zipthùng chứa.
Dennis

@Dennis ah, cảm ơn bạn đã xóa nó. Không thấy rằng OP đang sử dụng một .ZIPcontainer.
Đột phá

Đợi đã, vậy tôi sẽ nhận được một kết quả khác nếu tôi chỉ thay đổi phần mở rộng tệp của vùng chứa thành .7z?
Brian L

3
@BrianL có nút "cảm ơn" được tích hợp. Nó trông giống như một mũi tên hướng lên trên;)
nhinkle

5

Đây là một câu hỏi cũ và không phải là câu trả lời cho câu hỏi cụ thể mà là câu trả lời cho tinh thần của câu hỏi (Sử dụng tất cả các lõi để nén định dạng zip)

pigz (gzip song song với tùy chọn .zip)

pigz -K -k archive.zip bigfile txt

Điều này sẽ cung cấp cho bạn một tệp tương thích zip nhanh hơn 7 lần cho cùng mức nén.

Một so sánh nhanh về máy nén tương thích zip và không zip sử dụng lõi đơn và nhiều lõi.

thời gian treo tường trên i7-2600k để nén tệp txt 1.0gb trên fedora 20

67s (120mb) 7za (zip,1 thread)
15s (141mb) 7za -mx=4 (zip,1 thread)
17s (132mb) zip (zip,1 thread)
 5s (131mb) pigz -K -k (zip,8 threads)
 9s (106mb) bsc (libbsc.com) (not zip,8 threads)
 5s (130mb) zhuff -c2 (not zip,8 threads)
 2s (149mb) zhuff (not zip,8 threads)

thời gian tường để giải nén

4.2s unzip -t
2.0s pigz -t
5.1s bsc d
0.5s zhuff -d

Tại sao pigz khi bạn có thể pbzip2 hoặc pixz?
gật đầu

gzip là nhiều, nhanh hơn nhiều so với bzip2, vì vậy việc nén thêm không phải lúc nào cũng đáng.
jesjimher

0

Chỉ cần sử dụng -mmt [N + 1]

Ví dụ: -mmt2 dành cho một luồng, -mmt9 dành cho tám luồng


-1

Đã xác minh và kiểm tra: Để sử dụng đa luồng trên 7za, tham số phải là "-mmt #" chứ không phải "-mmt = #", đặt dấu bằng làm cho nó bỏ qua.

Làm thế nào tôi đã phát hiện ra? Sau khi tôi chạy 7z mà không có bất kỳ tham số nào, nó hiển thị thông tin về các tham số, trên các công tắc, nó nói "-mmt [N]", không phải "-mmt = [N]"

Vì vậy, nếu tôi hiểu rõ, tham số bạn đang gõ "-mmt = 2" có thể bị ghi sai và có thể là "-mmt2", không có dấu bằng.

Không chắc chắn nếu tôi hiểu tốt, tiếng Anh của tôi thực sự kém.

Nhân tiện, tại sao bạn sử dụng "7za" thay vì chỉ "7z"?

Vì vậy, để kiểm tra tham số tôi chạy một tập hợp các lệnh để thực hiện băng ghế dự bị và điều đó đã xác nhận lỗi đánh máy trên một số tài liệu. Tham số chính xác phải được gõ mà không có dấu bằng.

Lệnh thực hiện điểm chuẩn với 7z chỉ với một luồng: 7z b -mmt1

Lệnh thực hiện điểm chuẩn với 7z chỉ với hai luồng: 7z b -mmt2

Lệnh thực hiện điểm chuẩn với 7za chỉ với hai luồng: 7za b -mmt2

Lệnh thực hiện điểm chuẩn với 7za chỉ với một luồng: 7za b -mmt1

Không có dấu bằng trên tham số ˋ-mmt #, không cho 7z, cũng không phải 7za.

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.