Câu trả lời:
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ư pigz
hoặc pbzip2
cải thiện gzip
hoặc bzip2
.
Nếu bạn sort
không song song, bạn có thể thử và cài đặt GNU sort
từ 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 --parallel
tùy chọn.
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 sort
chính chương trình đang hoán đổi các khối thành đĩa và quay lại. Các sort
triể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ũ.
sort
có một -m
tù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
.
split
và merge
và xem nếu nó giúp.
merge(1)
có khả năng áp dụng ở đây. Sử dụng sort -m
.
sort --merge
.
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.
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 (!!!)
LC_ALL=C
đủ?
LC_COLLATE
là đủ rồi. AFAIK sort
sử dụng strcoll
để so sánh và trang này cho biết hành vi phụ thuộc vàoLC_COLLATE
#! /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