Một unix tốt hơn tìm thấy với xử lý song song?


43

find(1)Tiện ích unix rất hữu ích cho phép tôi thực hiện một hành động trên nhiều tệp khớp với các thông số kỹ thuật nhất định, ví dụ:

find /dump -type f -name '*.xml' -exec java -jar ProcessFile.jar {} \;

Ở trên có thể chạy một tập lệnh hoặc công cụ trên mỗi tệp XML trong một thư mục cụ thể.

Giả sử tập lệnh / chương trình của tôi mất rất nhiều thời gian của CPU và tôi có 8 bộ xử lý. Sẽ rất tốt nếu xử lý tối đa 8 tệp cùng một lúc.

GNU make cho phép xử lý công việc song song với -jcờ nhưng finddường như không có chức năng đó. Có một phương pháp lập kế hoạch công việc chung khác để tiếp cận điều này?

Câu trả lời:


65

xargsvới -Ptùy chọn (số lượng quá trình). Nói rằng tôi muốn nén tất cả các logfiles trong một thư mục trên máy 4-cpu:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -P 4 bzip2

Bạn cũng có thể nói -n <number>về số lượng đơn vị công việc tối đa cho mỗi quy trình. Vì vậy, nói rằng tôi đã có 2500 tập tin và tôi nói:

find . -name '*.log' -mtime +3 -print0 | xargs -0 -n 500 -P 4 bzip2

Điều này sẽ bắt đầu 4 bzip2quy trình, mỗi quy trình có 500 tệp và sau đó khi quá trình đầu tiên hoàn thành, một quy trình khác sẽ được bắt đầu cho 500 tệp cuối cùng.

Không chắc chắn tại sao câu trả lời trước sử dụng xargs make , bạn có hai động cơ song song ở đó!


7
Với find / xargs, hãy cẩn thận: tìm mặc định cho dòng mới dưới dạng dấu phân cách đầu ra, nhưng xargs mặc định cho bất kỳ khoảng trắng nào dưới dạng dấu phân cách đầu vào. Sử dụng -0 cho cả hai để an toàn hoặc chuyển sang GNU song song, mặc định là dòng mới dưới dạng dấu phân cách đầu vào (khớp với đầu ra của find).
ephemient

1
Wow, thật tuyệt vời! Tôi vừa kiểm tra, và đó là sự thật, xargs có một -Ptùy chọn!
PP.

Cảnh giác với việc sử dụng xargs -P- nó có một lỗi không bao giờ sửa được khi cắt xén đầu ra (không giống như parallel) mỗi khi có 2 luồng xảy ra để tạo đầu ra vào cùng một thời điểm chính xác ...
Vlad

34

GNU song song cũng có thể giúp.

find /dump -type f -name '*.xml' | parallel -j8 java -jar ProcessFile.jar {}

Lưu ý rằng không có -j8đối số, parallelmặc định số lượng lõi trên máy của bạn :-)


6

Không cần phải "sửa chữa" find- sử dụng makechính nó để xử lý song song.

Yêu cầu quá trình của bạn tạo một tệp nhật ký hoặc một số tệp đầu ra khác, sau đó sử dụng Makefile như thế này:

.SUFFIXES:  .xml .out

.xml.out:
        java -jar ProcessFile.jar $< 1> $@

và được gọi như vậy:

find /dump -type f -name '*.xml' | sed -e 's/\.xml$/.out/' | xargs make -j8

Tốt hơn nữa, nếu bạn đảm bảo rằng tệp đầu ra chỉ được tạo khi hoàn thành thành công quy trình Java, bạn có thể tận dụng makexử lý phụ thuộc của mình để đảm bảo rằng lần sau chỉ có các tệp chưa được xử lý được thực hiện.


1
Hy vọng rằng không có không gian hoặc các nhân vật "thú vị" khác trong các tên tệp đó; Làm cho không xử lý những người rất thanh lịch.
ephemient

Ý tưởng tuyệt vời Không bao giờ nghĩ đến việc sử dụng makefiles như thế này.
oscfri

3

Tìm có một tùy chọn song song bạn có thể sử dụng trực tiếp bằng biểu tượng "+"; không yêu cầu xargs. Kết hợp nó với grep, nó có thể xé toạc cây của bạn một cách nhanh chóng để tìm kiếm các trận đấu. ví dụ: nếu tôi đang tìm tất cả các tệp trong thư mục nguồn của mình có chứa chuỗi 'foo', tôi có thể gọi
find sources -type f -exec grep -H foo {} +


12
Đọc hướng dẫn tìm kiếm, bạn có thể thấy rằng -exec command +cú pháp không chạy song song, nhưng "nhóm" nhiều tệp lại với nhau và chạy lệnh với nhiều tệp làm đối số cùng một lúc. Nó xảy ra rằng grep có thể nhìn xuyên qua các mục tiêu của nó song song.
Tòa nhà chọc trời
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.