ความสามารถในการปรับขนาดของ 'sort -u' สำหรับไฟล์ขนาดยักษ์


23

ขีดจำกัดความสามารถในการปรับขยายที่เหมาะสมของ 'sort -u' คืออะไร (ในมิติของ "ความยาวบรรทัด", "จำนวนบรรทัด", "ขนาดไฟล์ทั้งหมด"?)

อะไรคือทางเลือกของ Unix สำหรับไฟล์ที่เกินขนาดนี้ในมิติของ "จำนวนบรรทัด"? (แน่นอนว่าฉันสามารถใช้งานได้อย่างง่ายดาย แต่ฉันสงสัยว่ามีบางสิ่งที่สามารถทำได้ด้วยคำสั่ง Linux มาตรฐานจำนวนน้อยไหม?)


สำหรับผู้ที่อาจต้องการค้นหาแบบไบนารีหรือรู้วิธี: unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
มีสถานการณ์ที่uniqก่อนหน้านี้sort -uจะช่วยได้ BTW สำหรับข้อมูล ASCII LC_ALL=C sortเพิ่มความเร็ว GNU sortล็อตที่แย่มาก (ดูคำตอบนี้ )
Walter Tross

คำตอบ:


39

sortที่คุณพบบนลินุกซ์มาจากcoreutilsแพคเกจและการดำเนินการผสานภายนอก R-Way มันแยกข้อมูลออกเป็นส่วน ๆ ที่สามารถจัดการในหน่วยความจำเก็บไว้ในแผ่นดิสก์แล้วผสานเข้าด้วยกัน ชิ้นจะทำในแบบคู่ขนานหากเครื่องมีหน่วยประมวลผลสำหรับสิ่งนั้น

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


3
โปรดทราบว่าการจัดเรียง GNU สามารถบีบอัดไฟล์ชั่วคราวเหล่านั้นเพื่อแพ็คได้มากขึ้น (และเพิ่มประสิทธิภาพด้วยดิสก์ช้า)
Stéphane Chazelas

1
@ StéphaneChazelasขอบคุณสำหรับการอัพเดท ฉันสงสัยตัวเองว่าการเรียงลำดับนั้นฉลาดพอที่จะลบไฟล์อันใดอันหนึ่งเมื่อถูกผสานอย่างสมบูรณ์ (ซึ่งอาจเกิดขึ้นได้ง่ายหากแหล่งที่มานั้นถูกจัดเรียงบางส่วนแล้ว) เป็นการเพิ่มประสิทธิภาพของพื้นที่ ฉันไม่ได้มีเวลาที่จะดำดิ่งลงในซอร์สโค้ดในวันนี้ :-(
Anthon

3
นอกเหนือจากหน่วยความจำยังมีข้อ จำกัด อื่นที่ใช้กับเฟสการผสาน: จำนวนไฟล์ที่สามารถเปิดพร้อมกันได้ โดยทั่วไปนี่เป็นข้อ จำกัด ที่กำหนดโดยระบบปฏิบัติการ GNU จัดเรียง copes ด้วยเช่นกันโดยการรวมจำนวนไฟล์ซ้ำ ๆ มันสามารถเปิดไฟล์เก่าได้ในคราวเดียว!
Diomidis Spinellis

@ StéphaneChazelasถ้าฉันออกแบบเครื่องมือสำหรับเรียงไฟล์ขนาดใหญ่โดยเฉพาะฉันจะจัดเก็บบรรทัดเป็นดัชนีลงในไฟล์ต้นฉบับ GNU จัดเรียงแบบนี้หรือไม่เพียงใช้อัลกอริทึมการบีบอัดแบบธรรมดา
Random832

3
@ Random832 และมันหมายถึงการที่จะสามารถเขียนทับไฟล์ที่ตัวเอง ( sort -o file file)
Stéphane Chazelas

1

ฉันไม่สามารถพูดถึงการใช้งานเฉพาะของผู้จัดจำหน่าย แต่การUNIX sortใช้งานแยกไฟล์ขนาดใหญ่เป็นไฟล์ขนาดเล็กเรียงลำดับไฟล์เหล่านี้แล้วรวมไฟล์ที่มีขนาดเล็กที่เรียงลำดับแล้วลงในเอาต์พุตที่เรียงลำดับแบบรวม

ข้อ จำกัด เพียงพื้นที่ดิสก์สำหรับไฟล์ขนาดเล็กที่สร้างขึ้นโดย intermediately แต่ไฟล์ที่สามารถเปลี่ยนเส้นทางไปยังไดเรกทอรีโดยพลการโดยการตั้งค่าตัวแปรสภาพแวดล้อมsortTMPDIR


3
คุณเรียกการใช้การเรียงลำดับของ UNIXว่าอะไรกันแน่ ? มันเป็นต้นฉบับจาก Unix เวอร์ชัน 3 หรือไม่? หน้าคนที่นั่นบอกว่าไม่สามารถเรียงลำดับไฟล์ที่ใหญ่กว่า 128KiB ได้
Stéphane Chazelas

คุณเข้าใจอะไรใน Unix เวอร์ชัน 3 รุ่นจากปี 1973? การใช้การเรียงลำดับ UNIX ดั้งเดิมได้รับการปรับปรุงในช่วงหลายปีที่ผ่านมาและ IIRC รุ่น Solaris นั้นเร็วกว่ารุ่น GNU มากยิ่งขึ้น แน่นอน 25 ปีที่แล้วการเรียงลำดับได้รับการปรับปรุงให้เข้าใจอักขระหลายไบต์และสิ่งที่ฉันจำได้จากการสนทนา USENET คือการทำเช่นนี้อย่างมีประสิทธิภาพบน Solaris BTW: man largefileแสดงรายการsortเป็นไฟล์ขนาดใหญ่ที่รับรู้
schily

2
ดังนั้นคุณกำลังพูดถึงรุ่นเฉพาะของผู้จำหน่าย Oracle sortหรือไม่ หรืออนุพันธ์ของการจัดเรียงของ AT&T Unix บางรุ่น? หรือรุ่นที่ได้รับการรับรอง Unix ของsort(เช่น GNU sortบน OS / X)?
Stéphane Chazelas

คุณภาพของsortการใช้งานที่ทันสมัยเกี่ยวกับตัวอักษรแบบหลายไบต์อาจแตกต่างกันไปความจริงที่ว่าการsortแบ่งไฟล์กลางนั้นเป็นเรื่องปกติสำหรับการใช้งาน UNIX ทั้งหมดที่ใช้รหัสต้นฉบับ BTW: เวอร์ชัน Solaris คือ OSS เป็น "OpenSolaris" ดูที่sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/ …
2559

25 ปีที่แล้ว UTF-8 ยังไม่ได้ถูกประดิษฐ์ขึ้นมา? เพิ่มการรองรับ UTF-8 locales ใน Solaris 7 ( 1 , 2 ) คุณหมายถึงชุดอักขระหลายไบต์อื่น ๆ
Stéphane Chazelas

1

อ้างอิงจากhttps://blog.mafr.de/2010/05/23/sorting-large-files/และ/unix//a/88704/9689 :

split -n l/20 input input-
for inpf in input-* ; do
    sort --parallel="$(nproc --all)" "${inpf}" > sorted-"{$inpf}"
done
sort -m sorted-input-* > sorted-input

ปรับปรุง:

จากคำตอบข้างต้นเราจะเห็นว่าsortมีอยู่แล้วไม่สิ่งที่กล่าวถึง snippet - คือการผสานภายนอก R-Way ดังนั้นหลังจากทั้งหมดทำงานเพียง:

sort --parallel="$(nproc --all)" -u input > output

ควรจะเพียงพอ

สมมติฐานปัจจุบันของฉัน (โดยไม่ตรวจสอบรหัส) เกี่ยวกับข้อ จำกัด คือ:

  • ความยาวบรรทัดสูงสุดถูก จำกัด โดยจำนวนหน่วยความจำกายภาพ จัดเรียงต้องพอดีกับหน่วยความจำอย่างน้อยสองตัว
  • จำนวนบรรทัด - ฉันไม่ทราบ
  • ขนาดไฟล์ - แน่นอนโดยระบบไฟล์
  • จำนวนไฟล์ที่เปิดในแบบขนาน - ขึ้นอยู่กับระบบปฏิบัติการ (ขอบคุณDiomidis Spinellisสำหรับการชี้นี้!)

(คำตอบนี้ถูกทำเครื่องหมายว่าเป็นวิกิของชุมชน - ขอให้คุณปรับปรุงให้ดีขึ้น :))


2
GNU จะsortเรียงลำดับแบบขนานโดยค่าเริ่มต้น (ตั้งแต่ปี 2010 หลังจากหน้าเว็บที่คุณเชื่อมโยงไปถึง) --parallelมีการลดจำนวนเธรดที่เกิดขึ้นพร้อมกันแทนที่จะปล่อยให้sortกำหนดค่าที่เหมาะสม การเรียงลำดับจะทำการแยกและผสานภายในด้วยวิธีที่มีประสิทธิภาพมากขึ้นแล้ว ฉันสงสัยว่าการแยกที่พิเศษจะช่วยได้
Stéphane Chazelas
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.