2010-06-09 36 views
10

Tôi đang viết một tập lệnh nhỏ gọi là "PNGOUT" trên một vài trăm tệp PNG. Tôi chỉ cần làm điều này:Bash: làm thế nào để chỉ đơn giản là song song nhiệm vụ?

find $BASEDIR -iname "*png" -exec pngout {} \; 

Và sau đó tôi nhìn vào màn hình CPU của mình và nhận thấy chỉ một lõi được sử dụng, khá buồn.

Trong ngày và tuổi của lõi kép, quad, octo và hexa (?) Máy tính để bàn, làm thế nào để tôi chỉ đơn giản là song song nhiệm vụ này với Bash? (Đây không phải là lần đầu tiên tôi có nhu cầu như vậy, vì khá nhiều những cái utils này là mono-ren ... Tôi đã có trường hợp với bộ mã hóa mp3).

Chỉ cần chạy tất cả pngout trong nền hoạt động? Khi đó, của tôi sẽ tìm thấy lệnh như thế nào? (Tôi không chắc chắn cách trộn tìm và ký tự '&')

Tôi nếu có ba trăm ảnh, điều này có nghĩa là hoán đổi giữa ba trăm quy trình, điều này dường như không tuyệt vời sao !?

Hoặc tôi nên sao chép ba file hàng trăm tôi hoặc lâu hơn trong "nb dirs", nơi "nb dirs" sẽ được số lượng lõi, sau đó chạy đồng thời "nb thấy"? (sẽ đủ gần)

Nhưng làm cách nào để tôi thực hiện việc này?

Trả lời

18

Trả lời câu hỏi của riêng tôi ...Hóa ra đó là một tính năng khá vô danh của xargs lệnh có thể được sử dụng để thực hiện điều đó:

find . -iname "*png" -print0 | xargs -0 --max-procs=4 -n 1 pngout 

Bingo, ngay lập tức 4x tăng tốc trên một máy quad-lõi :)

+0

Tốt bắt. Ưu điểm của nguồn mở. Ai đó đã dành thời gian để xây dựng giống trứng và theo dõi mã thành xargs. Điều này là tương đối tầm thường đối với một cái gì đó như xargs. Lưu ý rằng tt có khả năng sẽ làm tăng tốc độ CPU của bạn trong khoảng thời gian nó chạy. Tôi theo dõi lõi tứ của mình và hiếm khi có tải trọng đáng kể. Có bốn nhiệm vụ BOINC niced đến giới hạn để tải trung bình là gần như alway hơi hơn 4. – BillThor

+4

haha! tôi đã có một bộ nhớ mờ nhạt rằng xargs có thể làm điều đó ... nhưng thật thú vị khi làm điều đó trong bash, ngay cả khi nó không tối ưu. (lưu ý, sử dụng -print0 trên tìm và -0 trong xargs để tránh các vấn đề với tên tập tin khó chịu) – Javier

+0

@Javier: nó tuyệt vời anyway để xem ở đây cách khác nhau để làm điều đó :) Tôi chỉnh sửa câu trả lời của riêng tôi để phản ánh của bạn * -print0 */* -0 * đề xuất :) – NoozNooz42

2

Ghép đôi khi hiếm khi tầm thường. Trong trường hợp của bạn nếu bạn có thể chọn tệp duy nhất trong các tập hợp có kích thước bằng nhau, thì bạn có thể chạy nhiều bản sao của tập lệnh tìm. Bạn không muốn kích hoạt 300 bức ảnh trong nền. Đối với các công việc như thế này thường là chạy nhanh hơn theo tuần tự. Bối cảnh lệnh hoặc sử dụng hàng loạt là cả hai tùy chọn khả thi.

Giả sử các tệp được đánh số liên tiếp, bạn có thể sử dụng mẫu tìm kiếm như "[0-4] .png" cho một tìm kiếm và " [5-9] .png" trên một tệp khác. Điều này sẽ giữ hai lõi chạy trong khoảng thời gian tương đương.

Nhiệm vụ trồng trọt sẽ liên quan đến thiết lập bộ điều phối. Việc xây dựng, thử nghiệm và chạy ứng dụng này sẽ mất khá nhiều thời gian.

Bật BOINC để sử dụng các bộ xử lý dự phòng này. Bạn có thể sẽ muốn bỏ qua các quy trình niced khi giám sát tần số CPU. Thêm mã như thế này vào rc.local.

for CPU in /sys/devices/system/cpu/cpu[0-9]*; do 
    echo 1 > ${CPU}/cpufreq/ondemand/ignore_nice_load 
done 
+0

chết tiệt, tôi đã trả lời của tôi câu hỏi của riêng bạn cùng lúc bạn đăng câu trả lời của mình. Câu trả lời thú vị ở đó. Tuy nhiên nhìn vào những gì tôi tìm thấy ... Nó chỉ ra * xargs * có thể được sử dụng để trivially song song các nhiệm vụ như vậy :) – NoozNooz42

+0

@ NoozNooz42 'xargs -P 2' khi được hỗ trợ nên tải hai lõi độc đáo. Luôn luôn giúp kiểm tra lại các trang của người đàn ông theo thời gian. Bản phát hành mới nhất có rất nhiều tùy chọn hữu ích. – BillThor

4

để đẻ trứng tất cả các nhiệm vụ trong nền:

find $BASEDIR -iname "*png" | while read f; do 
    pngout "$f" & 
done 

nhưng tất nhiên đó không phải là lựa chọn tốt nhất. để thực hiện các tác vụ 'n' tại một thời điểm:

i=0 
find $BASEDIR -iname "*png" | while read f; do 
    pngout "$f" & 
    i=$((i+1)) 
    if [[ $i -gt $NTASKS ]]; then 
    wait 
    i=0 
    fi 
done 

không tối ưu, vì cho đến khi tất cả các tác vụ đồng thời được hoàn tất để bắt đầu một nhóm khác; nhưng nó nên tốt hơn là không có gì.

+0

+1 cho bạn quá ... Tuy nhiên tôi tìm thấy một cách thanh lịch (tôi nghĩ) để làm điều đó, sử dụng một tính năng tương đối không rõ của lệnh * xargs * :) – NoozNooz42

+0

+1 cho bạn, tôi chỉ biết "chờ". Tôi có thể chờ tất cả các nhiệm vụ của tôi kết thúc trước khi thoát khỏi bash .. –

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