Tôi có thể song song sắp xếp?


13

Ví dụ: bzippbzip , phiên bản song song của bzip. Có bất kỳ công cụ song song như vậy sortđể cải thiện hiệu suất?

Câu trả lời:


12

Kể từ coreutils 8.6 (2010-10-15), GNU sortđã sắp xếp song song để sử dụng một số bộ xử lý có sẵn. Vì vậy, nó không thể được cải thiện hơn nữa trong vấn đề đó như pigzhoặc pbzip2cải thiện gziphoặc bzip2.

Nếu bạn sortkhông song song, bạn có thể thử và cài đặt GNU sorttừ phiên bản mới nhất của lõi GNU .

Với sắp xếp GNU, bạn có thể giới hạn số lượng luồng với --paralleltùy chọn.


2
sắp xếp ổn định giúp tăng hiệu suất 15%, ít nhất là trong khối lượng công việc thử nghiệm của tôi.
jrw32982 hỗ trợ Monica

8

Một điều luôn giúp tôi nhiều nhất với việc sắp xếp là cung cấp cho nó càng nhiều bộ nhớ càng tốt, để giảm sự hoán đổi, ví dụ:

sort -S 20G

4
Cảm ơn, đây cũng là một mẹo tôi sử dụng - hãy để chúng tôi sử dụng một nửa RAM, nếu cần:sort -S 50%
miku

6

Nếu tệp của bạn đủ lớn, việc sắp xếp sẽ gây ra sự hoán đổi đĩa, do bộ nhớ ảo được phân bổ đang phát triển quá lớn hoặc do sortchính chương trình đang hoán đổi các khối thành đĩa và quay lại. Các sorttriển khai cũ hơn có nhiều khả năng có loại hành vi "sắp xếp qua bộ đệm đĩa" này, vì đó là cách duy nhất để sắp xếp các tệp lớn trong những ngày cũ.

sortcó một -mtùy chọn có thể giúp bạn ở đây. Có thể nhanh hơn để chia tệp thành các phần - nói với split -l- sắp xếp chúng một cách độc lập, sau đó hợp nhất chúng lại với nhau.

Sau đó, một lần nữa, nó có thể là chính xác những gì "sắp xếp thông qua bộ đệm đĩa" làm. Cách duy nhất để tìm hiểu xem nó có giúp hay không là đánh giá nó trên tải thử nghiệm cụ thể của bạn. Tham số quan trọng sẽ là số dòng bạn đưa ra split -l.


Cảm ơn câu trả lời của bạn. Tôi sẽ tiến hành một số tiêu chuẩn với splitmergevà xem nếu nó giúp.
miku

@miku: Tôi không thấy merge(1)có khả năng áp dụng ở đây. Sử dụng sort -m.
Warren Young

1
xin lỗi vì sự dễ dãi của tôi, tôi muốn nói sort --merge.
miku

1
Nếu bạn tách tập tin và sắp xếp các phần bạn sẽ vẫn phải sắp xếp toàn bộ khi bạn đặt nó lại với nhau phải không? Làm thế nào sẽ nhanh hơn?
terdon

2
Đây là một biến thể của thuật toán sắp xếp hợp nhất , một trong những phương pháp sắp xếp nhanh nhất hiện có.
Warren Young

3

Tôi đã đạt được mức tăng rất đáng kể khi sử dụng sort -n, yêu cầu các giá trị số (float hoặc số nguyên) trong tất cả các cột được chọn, không có ký hiệu khoa học.

Một khả năng khác có thể mang lại sự cải thiện lớn trong quy trình của bạn là sử dụng thư mục được ánh xạ bộ nhớ /dev/shmđể xử lý các tệp trung gian.


3
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null

Thông thường, Linux sắp xếp một số công cụ tiện lợi để tuân thủ các quy tắc bình đẳng Unicode ... nếu bạn thay đổi ngôn ngữ thành C, nó chỉ chuyển sang byte ...

Đối với tệp 1,4 GB, sự khác biệt trên máy của tôi là 20 giây so với 400 giây (!!!)


Cảm ơn, nhưng sẽ không LC_ALL=Cđủ?
miku

Tôi nghĩ vậy ... có lẽ LC_COLLATElà đủ rồi. AFAIK sortsử dụng strcollđể so sánh và trang này cho biết hành vi phụ thuộc vàoLC_COLLATE
mt_

0
#! /bin/sh
#config MAX_LINES_PER_CHUNK based on file length
MAX_LINES_PER_CHUNK=1000 
ORIGINAL_FILE=inputfile.txt
SORTED_FILE=outputfile.txt
CHUNK_FILE_PREFIX=$ORIGINAL_FILE.split.
SORTED_CHUNK_FILES=$CHUNK_FILE_PREFIX*.sorted

 #Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null
rm -f $SORTED_FILE

#Splitting $ORIGINAL_FILE into chunks ...
split -l $MAX_LINES_PER_CHUNK $ORIGINAL_FILE $CHUNK_FILE_PREFIX

for file in $CHUNK_FILE_PREFIX*
do
    sort -n -t , -k 1,1 $file > $file.sorted &
done
wait

#echo "**********SORTED CHUNK FILES*********"
#echo $SORTED_CHUNK_FILES
#Merging chunks to $SORTED_FILE ...
sort  -mn $SORTED_CHUNK_FILES > $SORTED_FILE

#Cleanup any lefover files
rm -f $SORTED_CHUNK_FILES > /dev/null
rm -f $CHUNK_FILE_PREFIX* > /dev/null

tập tin được phân chia và sắp xếp nó sẽ tăng tốc độ sắp xếp


1
Chào! Câu trả lời này có thể được cải thiện bằng cách giải thích những gì nó có nghĩa là làm, thay vì chỉ là một bãi chứa mã (ngoài ra, nếu nó đã được điểm chuẩn để nhanh hơn sắp xếp GNU trên một số đầu vào, điều đó sẽ rất thú vị để biết!).
dhag
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.