Thời gian để nén các tệp rất lớn (100G)


27

Tôi thấy mình phải nén một số tệp rất lớn (80 GB) và tôi ngạc nhiên về tốc độ (thiếu) mà hệ thống của tôi đang thể hiện. Tôi nhận được khoảng 500 MB / phút tốc độ chuyển đổi; bằng cách sử dụng top, tôi dường như đang sử dụng một CPU với tỷ lệ xấp xỉ 100%.

Tôi khá chắc chắn rằng nó không (chỉ) tốc độ truy cập đĩa, vì việc tạo tartệp (đó là cách tạo tệp 80G) chỉ mất vài phút (có thể là 5 hoặc 10), nhưng sau hơn 2 giờ, lệnh gzip đơn giản của tôi vẫn còn không được thực hiện.

Tóm tắt:

tar -cvf myStuff.tar myDir/*

Mất <5 phút để tạo tệp tar 87 G

gzip myStuff.tar

Mất hai giờ 10 phút, tạo tệp zip 55G.

Câu hỏi của tôi: Điều này có bình thường không? Có những lựa chọn nhất định gzipđể tăng tốc mọi thứ? Nó sẽ nhanh hơn để nối các lệnh và sử dụng tar -cvfz? Tôi thấy tham chiếu đến pigz- Triển khai song song GZip - nhưng thật không may tôi không thể cài đặt phần mềm trên máy tôi đang sử dụng, vì vậy đó không phải là một tùy chọn cho tôi. Xem ví dụ câu hỏi trước đó .

Tôi dự định sẽ tự mình thử một số tùy chọn trong số các tùy chọn này - nhưng có khả năng là tôi sẽ không đạt được "sự kết hợp kỳ diệu" của các tùy chọn. Tôi hy vọng rằng ai đó trên trang web này biết mẹo phù hợp để tăng tốc mọi thứ.

Khi tôi có kết quả của các thử nghiệm khác, tôi sẽ cập nhật câu hỏi này - nhưng nếu có ai có một mẹo đặc biệt tốt, tôi thực sự sẽ đánh giá cao nó. Có lẽ gzip chỉ mất nhiều thời gian xử lý hơn tôi nhận ra ...

CẬP NHẬT

Như đã hứa, tôi đã thử các thủ thuật được khắc phục bên dưới: thay đổi mức độ nén và thay đổi đích của tệp. Tôi đã nhận được các kết quả sau cho một tar khoảng 4,1 GB:

flag    user      system   size    sameDisk
-1     189.77s    13.64s  2.786G     +7.2s 
-2     197.20s    12.88s  2.776G     +3.4s
-3     207.03s    10.49s  2.739G     +1.2s
-4     223.28s    13.73s  2.735G     +0.9s
-5     237.79s     9.28s  2.704G     -0.4s
-6     271.69s    14.56s  2.700G     +1.4s
-7     307.70s    10.97s  2.699G     +0.9s
-8     528.66s    10.51s  2.698G     -6.3s
-9     722.61s    12.24s  2.698G     -4.0s

Vì vậy, có, việc thay đổi cờ từ mặc định -6thành nhanh nhất -1giúp tôi tăng tốc 30%, với (đối với dữ liệu của tôi) hầu như không có bất kỳ thay đổi nào đối với kích thước của tệp zip. Cho dù tôi đang sử dụng cùng một đĩa hay một đĩa khác đều không có sự khác biệt (tôi sẽ phải chạy nó nhiều lần để có bất kỳ ý nghĩa thống kê nào).

Nếu bất cứ ai quan tâm, tôi đã tạo các điểm chuẩn thời gian này bằng hai tập lệnh sau:

#!/bin/bash
# compare compression speeds with different options
sameDisk='./'
otherDisk='/tmp/'
sourceDir='/dirToCompress'
logFile='./timerOutput'
rm $logFile

for i in {1..9}
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $sameDisk $logFile
  do  /usr/bin/time -a --output=timerOutput ./compressWith $sourceDir $i $otherDisk $logFile
done

Và tập lệnh thứ hai ( compressWith):

#!/bin/bash
# use: compressWith sourceDir compressionFlag destinationDisk logFile
echo "compressing $1 to $3 with setting $2" >> $4
tar -c $1 | gzip -$2 > $3test-$2.tar.gz

Ba điều cần lưu ý:

  1. Sử dụng /usr/bin/timethay vì time, vì lệnh tích hợp bashcó nhiều tùy chọn ít hơn lệnh GNU
  2. Tôi không bận tâm sử dụng --formattùy chọn mặc dù điều đó sẽ làm cho tệp nhật ký dễ đọc hơn
  3. Tôi đã sử dụng một tập lệnh trong tập lệnh vì timedường như chỉ hoạt động trên lệnh đầu tiên trong chuỗi được xử lý (vì vậy tôi đã làm cho nó trông giống như một lệnh duy nhất ...).

Với tất cả những gì đã học, kết luận của tôi là

  1. Tăng tốc mọi thứ với -1cờ (câu trả lời được chấp nhận)
  2. Mất nhiều thời gian hơn để nén dữ liệu hơn là đọc từ đĩa
  3. Đầu tư vào phần mềm nén nhanh hơn ( pigzcó vẻ như là một lựa chọn tốt).
  4. Nếu bạn có nhiều tệp để nén, bạn có thể đặt từng gziplệnh trong luồng riêng của nó và sử dụng nhiều CPU có sẵn hơn (người nghèo pigz)

Cảm ơn tất cả mọi người đã giúp tôi tìm hiểu tất cả điều này!


tar -cvf không thực hiện bất kỳ nén nào nên sẽ nhanh hơn
parkydr

2
@Floris: loại dữ liệu nào bạn đang cố nén? lưu ý phụ: $> gzip -c myStuff.tar | pv -r -b > myStuff.tar.gzsẽ cho bạn thấy máy của bạn đang nén các công cụ nhanh như thế nào. side-note2: lưu kết quả vào một đĩa khác.
akira

3
Xin lỗi, tôi đọc sai câu hỏi của bạn. gzip có tùy chọn --fast để chọn nén nhanh nhất
parkydr

1
@parkydr: Tùy chọn --fast là tùy chọn mà tôi không biết về ... đó là tùy chọn cuối cùng trong mantrang và tôi đã không đọc đến đó (vì nó được sắp xếp theo 'lệnh một chữ cái', đó là -#) . Điều đó sẽ dạy tôi đến RTFM! Đây sẽ là điều tiếp theo tôi thử!
Floris

2
Lưu ý rằng nếu một trình biên dịch phù hợp có sẵn trên máy và các quyền của hệ thống tập tin không được thiết lập để cấm thực thi các nhị phân từ các thư mục bạn có quyền truy cập, bạn có thể biên dịch pigzvà chạy nó từ bất cứ nơi nào bạn có thể xây dựng nó mà không cần cài đặt nó. Nếu không có trình biên dịch, bạn có thể biên dịch chéo nó trên một máy tính khác, mặc dù điều đó bắt đầu có nhiều nỗ lực hơn mức có thể đáng giá. (Tùy thuộc vào mức độ bạn cần nén này để chạy nhanh hơn, tôi đoán vậy.)
David Z

Câu trả lời:


27

Bạn có thể thay đổi tốc độ của gzip bằng cách sử dụng --fast --besthoặc -#trong đó # là một số trong khoảng từ 1 đến 9 (1 là nhanh nhất nhưng ít nén hơn, 9 chậm nhất nhưng nén nhiều hơn). Theo mặc định, gzip chạy ở cấp 6.


26

Lý do tar mất rất ít thời gian so với gzip là vì có rất ít chi phí tính toán trong việc sao chép các tệp của bạn thành một tệp duy nhất (đó là những gì nó làm). Mặt khác, gzip thực sự đang sử dụng các thuật toán nén để thu nhỏ tệp tar.

Vấn đề là gzip bị ràng buộc (như bạn đã khám phá) đối với một luồng.

Nhập pigz , có thể sử dụng nhiều luồng để thực hiện nén. Một ví dụ về cách sử dụng này sẽ là:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip

Có một bản tóm tắt ngắn gọn về tùy chọn --use-nén-chương trình trên một trang web chị em .


Cảm ơn câu trả lời và liên kết của bạn. Tôi thực sự đã đề cập đến pigz trong câu hỏi.
Floris

Đây là câu trả lời đúng ở đây ..!
stolsvik

4

Tôi dường như đang sử dụng một CPU duy nhất ở mức xấp xỉ 100%.

Điều đó có nghĩa là không có vấn đề về hiệu năng I / O mà việc nén chỉ sử dụng một luồng (sẽ xảy ra với gzip).

Nếu bạn quản lý để đạt được quyền truy cập / thỏa thuận cần thiết để cài đặt các công cụ khác, thì 7zip cũng hỗ trợ nhiều luồng để tận dụng CPU đa lõi, mặc dù tôi không chắc liệu điều đó có mở rộng sang định dạng gzip hay không.

Nếu bạn bị mắc kẹt chỉ sử dụng gzip trong thời gian hiện tại và có nhiều tệp để nén, bạn có thể thử nén chúng riêng lẻ - theo cách đó bạn sẽ sử dụng nhiều CPU đa lõi đó bằng cách chạy song song nhiều quá trình. Tuy nhiên, hãy cẩn thận đừng lạm dụng nó vì ngay khi bạn đạt được bất kỳ nơi nào gần khả năng của hiệu suất hệ thống con I / O của bạn sẽ giảm nhanh chóng (xuống thấp hơn so với khi bạn đang sử dụng một quy trình / luồng) vì độ trễ của chuyển động đầu trở nên đáng kể nút cổ chai.


Cảm ơn vì đầu vào của bạn. Bạn đã cho tôi một ý tưởng (mà bạn nhận được một upvote): vì tôi có nhiều tài liệu lưu trữ để tạo nên tôi chỉ có thể viết các lệnh riêng lẻ theo sau &- sau đó để hệ thống xử lý nó từ đó. Mỗi cái sẽ chạy trên bộ xử lý riêng của nó và vì tôi dành nhiều thời gian hơn cho việc nén hơn so với I / O, nên sẽ mất cùng thời gian để thực hiện một thao tác như làm tất cả 10 trong số chúng. Vì vậy, tôi nhận được "hiệu suất đa lõi" từ một thực thi mà chỉ có một luồng ...
Floris

1

Người ta có thể khai thác số lượng quá trình có sẵn trong pigz, thường có hiệu suất nhanh hơn như được hiển thị trong lệnh sau

tar cf - thư mục để lưu trữ | pigz -0 -p tinyenumber> mydir.tar.gz

Ví dụ - tar cf - patha | pigz -0 -p 32> patha.tar.gz

Điều này có thể nhanh hơn các phương thức được đề xuất trong bài vì -p là số lượng quy trình người ta có thể chạy. Theo kinh nghiệm cá nhân của tôi, thiết lập một giá trị rất lớn không ảnh hưởng đến hiệu năng nếu thư mục được lưu trữ bao gồm một số lượng lớn các tệp nhỏ. Khác giá trị mặc định được xem xét là 8. Đối với các tệp lớn, khuyến nghị của tôi sẽ là đặt giá trị này dưới dạng tổng số luồng được hỗ trợ trên hệ thống.

Ví dụ thiết lập giá trị p = 32 trong trường hợp máy 32 CPU giúp.

0 có nghĩa là để nén pigz nhanh nhất vì nó không nén lưu trữ và thay vào đó tập trung vào tốc độ. Giá trị mặc định là 6 để nén.

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.