ตัวอย่างเช่นสำหรับbzip
มีpbzipbzip
รุ่นขนาน มีเครื่องมือการขนานใด ๆsort
เพื่อปรับปรุงประสิทธิภาพหรือไม่
ตัวอย่างเช่นสำหรับbzip
มีpbzipbzip
รุ่นขนาน มีเครื่องมือการขนานใด ๆsort
เพื่อปรับปรุงประสิทธิภาพหรือไม่
คำตอบ:
ในฐานะของ coreutils 8.6 (2010-10-15) GNU sort
ได้จัดเรียงแบบขนานเพื่อใช้ประโยชน์จากโปรเซสเซอร์หลายตัวที่มีให้ใช้งาน ดังนั้นจึงไม่สามารถปรับปรุงเพิ่มเติมในเรื่องเช่นนั้นpigz
หรือpbzip2
ปรับปรุงหรือgzip
bzip2
หากคุณsort
ไม่ขนานคุณสามารถลองและติดตั้ง GNU sort
จากcoreutils GNUรุ่นล่าสุดได้
ด้วยการจัดเรียง GNU คุณสามารถ จำกัด จำนวนเธรดด้วย--parallel
ตัวเลือก
สิ่งหนึ่งที่ช่วยฉันได้มากที่สุดในการเรียงลำดับคือให้ความทรงจำมากที่สุดเท่าที่จะทำได้เพื่อลดการแลกเปลี่ยนเช่น:
sort -S 20G
sort -S 50%
หากไฟล์ของคุณมีขนาดใหญ่พอการเรียงลำดับจะทำให้เกิดการแลกเปลี่ยนดิสก์เนื่องจากหน่วยความจำเสมือนที่จัดสรรไว้มีขนาดใหญ่เกินไปหรือเนื่องจากsort
ตัวโปรแกรมเองทำการสลับสับเปลี่ยนเป็นดิสก์และย้อนกลับ sort
การใช้งานที่เก่ากว่ามีแนวโน้มที่จะมีการเรียงลำดับพฤติกรรมแบบ "เรียงผ่านดิสก์บัฟเฟอร์" เนื่องจากเป็นวิธีเดียวที่จะจัดเรียงไฟล์ขนาดใหญ่ในสมัยก่อน
sort
มี-m
ตัวเลือกที่อาจช่วยคุณได้ที่นี่ มันอาจจะเร็วกว่าที่จะแยกไฟล์ออกเป็นชิ้น ๆ - พูดด้วยsplit -l
- เรียงลำดับพวกมันแยกกันแล้วรวมกลับเข้าด้วยกัน
จากนั้นอีกครั้งอาจเป็นไปได้ว่านี่เป็นสิ่งที่ "จัดเรียงผ่านบัฟเฟอร์ดิสก์" วิธีเดียวที่จะตรวจสอบว่าช่วยได้หรือไม่คือการเปรียบเทียบกับการโหลดการทดสอบของคุณ split -l
พารามิเตอร์ที่สำคัญจะมีการนับจำนวนบรรทัดที่คุณให้กับ
split
และmerge
และดูว่ามันจะช่วยให้
merge(1)
มีการบังคับใช้ที่นี่ sort -m
ใช้
sort --merge
ขอโทษสำหรับความหย่อนของฉันฉันหมายถึง
ฉันได้รับการใช้อย่างมีนัยสำคัญมากsort -n
ซึ่งต้องใช้ค่าตัวเลข (ทศนิยมหรือจำนวนเต็ม) ในคอลัมน์ที่เลือกทั้งหมดโดยไม่มีเครื่องหมายทางวิทยาศาสตร์
ความเป็นไปได้อีกประการหนึ่งที่อาจนำมาปรับปรุงกระบวนการของคุณให้ดียิ่งขึ้นก็คือการใช้โฟลเดอร์หน่วยความจำที่แมป/dev/shm
เพื่อจัดการกับไฟล์ตัวกลาง
export LC_COLLATE=C
export LANG=C
cat big_file | sort > /dev/null
การเรียงลำดับ Linux แบบปกติทำสิ่งที่ดีเพื่อให้สอดคล้องกับกฎความเท่าเทียมกันของ Unicode ... หากคุณเปลี่ยนโลแคลเป็น C จะสลับเป็นไบต์เท่านั้น ...
สำหรับไฟล์ 1.4GB ความแตกต่างในเครื่องของฉันคือ 20s กับ 400s (!!!)
LC_ALL=C
เพียงพอหรือไม่
LC_COLLATE
จะเพียงพอแล้ว AFAIK sort
ใช้strcoll
สำหรับการเปรียบเทียบและ manpage กล่าวว่าพฤติกรรมนั้นขึ้นอยู่กับLC_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
ไฟล์ถูกแบ่งและจัดเรียงมันจะเพิ่มความเร็วในการเรียงลำดับ