ฉันสามารถเรียงลำดับแบบขนานได้หรือไม่


13

ตัวอย่างเช่นสำหรับbzipมีpbzipbzipรุ่นขนาน มีเครื่องมือการขนานใด ๆsortเพื่อปรับปรุงประสิทธิภาพหรือไม่

คำตอบ:


12

ในฐานะของ coreutils 8.6 (2010-10-15) GNU sortได้จัดเรียงแบบขนานเพื่อใช้ประโยชน์จากโปรเซสเซอร์หลายตัวที่มีให้ใช้งาน ดังนั้นจึงไม่สามารถปรับปรุงเพิ่มเติมในเรื่องเช่นนั้นpigzหรือpbzip2ปรับปรุงหรือgzipbzip2

หากคุณsortไม่ขนานคุณสามารถลองและติดตั้ง GNU sortจากcoreutils GNUรุ่นล่าสุดได้

ด้วยการจัดเรียง GNU คุณสามารถ จำกัด จำนวนเธรดด้วย--parallelตัวเลือก


2
sort - เสถียรให้ประสิทธิภาพเพิ่มขึ้น 15% อย่างน้อยในภาระงานทดสอบของฉัน
jrw32982 รองรับ Monica

8

สิ่งหนึ่งที่ช่วยฉันได้มากที่สุดในการเรียงลำดับคือให้ความทรงจำมากที่สุดเท่าที่จะทำได้เพื่อลดการแลกเปลี่ยนเช่น:

sort -S 20G

4
ขอบคุณนี่เป็นเคล็ดลับที่ฉันใช้เมื่อเร็ว ๆ นี้เช่นกัน - ให้เรียงลำดับใช้ครึ่ง RAM ถ้าจำเป็น:sort -S 50%
miku

6

หากไฟล์ของคุณมีขนาดใหญ่พอการเรียงลำดับจะทำให้เกิดการแลกเปลี่ยนดิสก์เนื่องจากหน่วยความจำเสมือนที่จัดสรรไว้มีขนาดใหญ่เกินไปหรือเนื่องจากsortตัวโปรแกรมเองทำการสลับสับเปลี่ยนเป็นดิสก์และย้อนกลับ sortการใช้งานที่เก่ากว่ามีแนวโน้มที่จะมีการเรียงลำดับพฤติกรรมแบบ "เรียงผ่านดิสก์บัฟเฟอร์" เนื่องจากเป็นวิธีเดียวที่จะจัดเรียงไฟล์ขนาดใหญ่ในสมัยก่อน

sortมี-mตัวเลือกที่อาจช่วยคุณได้ที่นี่ มันอาจจะเร็วกว่าที่จะแยกไฟล์ออกเป็นชิ้น ๆ - พูดด้วยsplit -l- เรียงลำดับพวกมันแยกกันแล้วรวมกลับเข้าด้วยกัน

จากนั้นอีกครั้งอาจเป็นไปได้ว่านี่เป็นสิ่งที่ "จัดเรียงผ่านบัฟเฟอร์ดิสก์" วิธีเดียวที่จะตรวจสอบว่าช่วยได้หรือไม่คือการเปรียบเทียบกับการโหลดการทดสอบของคุณ split -lพารามิเตอร์ที่สำคัญจะมีการนับจำนวนบรรทัดที่คุณให้กับ


ขอบคุณสำหรับคำตอบ. ผมจะดำเนินการบางอย่างกับมาตรฐานsplitและmergeและดูว่ามันจะช่วยให้
miku

@miku: ฉันไม่เห็นว่าmerge(1)มีการบังคับใช้ที่นี่ sort -mใช้
Warren Young

1
sort --mergeขอโทษสำหรับความหย่อนของฉันฉันหมายถึง
miku

1
หากคุณแบ่งไฟล์และเรียงลำดับชิ้นส่วนคุณจะยังต้องเรียงลำดับสิ่งทั้งหมดเมื่อคุณนำกลับมารวมกันใช่ไหม มันจะเร็วแค่ไหน?
terdon

2
นี่เป็นตัวแปรในอัลกอริทึมการเรียงแบบผสานซึ่งเป็นหนึ่งในวิธีการเรียงลำดับที่เร็วที่สุดที่มี
Warren Young

3

ฉันได้รับการใช้อย่างมีนัยสำคัญมากsort -nซึ่งต้องใช้ค่าตัวเลข (ทศนิยมหรือจำนวนเต็ม) ในคอลัมน์ที่เลือกทั้งหมดโดยไม่มีเครื่องหมายทางวิทยาศาสตร์

ความเป็นไปได้อีกประการหนึ่งที่อาจนำมาปรับปรุงกระบวนการของคุณให้ดียิ่งขึ้นก็คือการใช้โฟลเดอร์หน่วยความจำที่แมป/dev/shmเพื่อจัดการกับไฟล์ตัวกลาง


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

การเรียงลำดับ Linux แบบปกติทำสิ่งที่ดีเพื่อให้สอดคล้องกับกฎความเท่าเทียมกันของ Unicode ... หากคุณเปลี่ยนโลแคลเป็น C จะสลับเป็นไบต์เท่านั้น ...

สำหรับไฟล์ 1.4GB ความแตกต่างในเครื่องของฉันคือ 20s กับ 400s (!!!)


ขอบคุณ แต่จะไม่LC_ALL=Cเพียงพอหรือไม่
miku

ฉันคิดว่า ... อาจLC_COLLATEจะเพียงพอแล้ว AFAIK sortใช้strcollสำหรับการเปรียบเทียบและ manpage กล่าวว่าพฤติกรรมนั้นขึ้นอยู่กับLC_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

ไฟล์ถูกแบ่งและจัดเรียงมันจะเพิ่มความเร็วในการเรียงลำดับ


1
Hi! คำตอบนี้สามารถปรับปรุงได้โดยการอธิบายว่าควรทำอย่างไรแทนที่จะเป็นเพียงการถ่ายโอนข้อมูล (เช่นถ้ามีการเปรียบเทียบเพื่อให้เร็วกว่า GNU เรียงลำดับในอินพุตบางส่วนซึ่งน่าสนใจที่จะรู้!)
dhag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.