Sắp xếp - vô song không song song


10

Tôi đang cố gắng tạo một tập hợp các dòng duy nhất được lấy từ một tệp có egrep với sort -u, sau đó đếm chúng. Khoảng 10% số dòng (tất cả 100 ký tự từ bảng chữ cái [ATCG]) được sao chép. Có hai tệp, mỗi tệp khoảng 3 hợp đồng, 50% không liên quan, có lẽ 300 triệu dòng.

LC_ALL=C  grep -E  <files> |  sort --parallel=24  -u | wc -m

Giữa LC_ALL = C và sử dụng -x để tăng tốc grep, phần chậm nhất cho đến nay là sắp xếp. Đọc các trang của người đàn ông đã đưa tôi đến - vô song = n, nhưng thử nghiệm cho thấy hoàn toàn không có cải thiện. Một chút đào với đỉnh cho thấy rằng ngay cả với - vô song = 24, quá trình sắp xếp chỉ chạy trên một bộ xử lý tại một thời điểm.

Tôi có 4 chip với 6 lõi và 2 luồng / lõi, cho tổng cộng 48 bộ xử lý logic. Xem lscpu vì / Proc / cpuinfo sẽ quá dài.

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             4
NUMA node(s):          8
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 1
Stepping:              2
CPU MHz:               1400.000
BogoMIPS:              5199.96

Tôi đang thiếu gì? Ngay cả khi quy trình bị ràng buộc IO, dù sao tôi cũng không nên xem xử lý song song? Quá trình sắp xếp sử dụng 99% bộ xử lý thực sự được bật tại bất kỳ thời điểm nào, vì vậy tôi sẽ có thể thấy sự song song nếu nó xảy ra. Bộ nhớ không phải là vấn đề đáng lo ngại, tôi có 256 Gb để chơi và không có cái nào được sử dụng bởi bất cứ thứ gì khác.

Một cái gì đó tôi phát hiện ra grep đường ống đến một tệp sau đó đọc tệp với sort:

 LC_ALL=C  grep -E  <files>  > reads.txt ; sort reads.txt  -u | wc -m

default, file 1m 50s
--parallel=24, file 1m15s
--parallel=48, file 1m6s
--parallel=1, no file 10m53s
--parallel=2, no file 10m42s
--parallel=4 no file 10m56s

others still running

Khi thực hiện các điểm chuẩn này, rõ ràng là khi sắp xếp đầu vào theo đường ống hoàn toàn không song song. Khi được phép đọc một sắp xếp tập tin sẽ chia tải theo hướng dẫn.


sortĐó là gì trên phân phối? Các tiêu chuẩn sortkhông biết tùy chọn đó.
ott--

uname -atheo "3.13.0-46-chung # 79-Ubuntu SMP" và lsb_release -atuyên bố 14.04.2 tên mã đáng tin cậy, và phiên bản sắp xếp đó là một phần của lõi gnu, theo man sort.
Jeremy Kemball

Dường như với tôi có những phần ở đây cần phải đọc lại: gnu.org/software/coreutils/manual/html_node/ Kẻ
Hannu

Tôi không chắc là tôi hiểu những gì bạn nhận được tại @Hannu, bạn có thể nói cụ thể hơn không? sắp xếp - vô song = 2 cũng không song song. Không 4 hoặc 8. nproc trả lại 48 như nó nên.
Jeremy Kemball

1
Tôi muốn nói ... đừng sử dụng coreutils cho việc này. Thật thú vị, chúng tôi đã có một câu hỏi rất giống nhau và cũng vậy .... mọi phương pháp khác đều hoạt động tốt hơn superuser.com/a/485987/10165
Journeyman Geek

Câu trả lời:


24

sắp xếp không tạo ra một luồng trừ khi nó cần, và đối với các tệp nhỏ, nó chỉ là quá nhiều chi phí. Bây giờ không may sắp xếp xử lý một đường ống như một tập tin nhỏ. Nếu bạn muốn cung cấp đủ dữ liệu cho 24 luồng thì bạn sẽ cần chỉ định sắp xếp để sử dụng bộ đệm nội bộ lớn (sắp xếp tự động khi được hiển thị với các tệp lớn). Đây là một cái gì đó chúng ta nên cải thiện về thượng nguồn (ít nhất là trong tài liệu). Vì vậy, bạn sẽ muốn một cái gì đó như:

(export LC_ALL=C; grep -E  <files> | sort -S1G --parallel=24 -u | wc -m)

Lưu ý Tôi đã đặt LC_ALL = C cho tất cả các quy trình, vì tất cả chúng đều có lợi với dữ liệu này).

BTW bạn có thể theo dõi các chủ đề sắp xếp với một cái gì đó như:

watch -n.1 ps -C sort -L -o pcpu
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.