จัดเรียง - ขนานไม่ขนาน


10

ฉันกำลังพยายามสร้างชุดของบรรทัดที่ดึงจากไฟล์ที่มี egrep ด้วย sort -u แล้วนับมัน ประมาณ 10% ของบรรทัด (ทั้งหมด 100 ตัวอักษรจากตัวอักษร [ATCG]) ซ้ำกัน มีไฟล์สองไฟล์แต่ละไฟล์มีความเกี่ยวข้องประมาณ 3 กิ๊ก 50% ไม่เกี่ยวข้องดังนั้นอาจเป็น 300 ล้านบรรทัด

LC_ALL=C  grep -E  <files> |  sort --parallel=24  -u | wc -m

ระหว่าง LC_ALL = C และการใช้ -x เพื่อเร่ง grep ส่วนที่ช้าที่สุดคือการเรียงลำดับ การอ่าน man pages ทำให้ฉัน --parallel = n แต่การทดลองแสดงให้เห็นว่าไม่มีการปรับปรุงอย่างแน่นอน การขุดเล็ก ๆ น้อย ๆ กับด้านบนแสดงให้เห็นว่าแม้จะมี --parallel = 24 กระบวนการเรียงลำดับจะทำงานบนโปรเซสเซอร์เพียงครั้งเดียว

ฉันมีชิป 4 ตัวที่มี 6 คอร์และ 2 เธรด / คอร์รวมโปรเซสเซอร์ 48 ตัว ดู lscpu เนื่องจาก / proc / cpuinfo จะยาวเกินไป

Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                48
On-line CPU(s) list:   0-47
Thread(s) per core:    2
Core(s) per socket:    6
Socket(s):             4
NUMA node(s):          8
Vendor ID:             AuthenticAMD
CPU family:            21
Model:                 1
Stepping:              2
CPU MHz:               1400.000
BogoMIPS:              5199.96

ฉันกำลังคิดถึงอะไร แม้ว่ากระบวนการนั้นมีการผูกไว้กับ IO ฉันไม่ควรเห็นการประมวลผลแบบขนานหรือไม่ กระบวนการเรียงลำดับใช้ 99% ของตัวประมวลผลที่เปิดใช้งานจริงในเวลาใดก็ตามดังนั้นฉันควรจะสามารถเห็นการทำงานแบบขนานหากเกิดขึ้น หน่วยความจำไม่ได้เป็นกังวลฉันมี 256 Gb ที่จะเล่นกับและไม่มีสิ่งอื่นใดถูกใช้

มีบางอย่างที่ฉันค้นพบ pip grep ไปยังไฟล์จากนั้นอ่านไฟล์ด้วย sort:

 LC_ALL=C  grep -E  <files>  > reads.txt ; sort reads.txt  -u | wc -m

default, file 1m 50s
--parallel=24, file 1m15s
--parallel=48, file 1m6s
--parallel=1, no file 10m53s
--parallel=2, no file 10m42s
--parallel=4 no file 10m56s

others still running

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


อะไรsortคือการกระจายตัวแบบไหน? มาตรฐานsortไม่ทราบตัวเลือกนั้น
ott--

uname -aจะช่วยให้ "3.13.0-46 ทั่วไป # 79 อูบุนตู SMP" และlsb_release -aเรียกร้อง 14.04.2 สมญานามเชื่อถือและรุ่นของการจัดเรียงที่เป็นส่วนหนึ่งของ coreutils GNU man sortตามไป
Jeremy Kemball

ดูเหมือนว่าฉันมีบางส่วนที่นี่ที่ต้องอ่านอีกครั้ง: gnu.org/software/coreutils/manual/html_node/…
Hannu

ฉันไม่แน่ใจว่าฉันเข้าใจสิ่งที่คุณได้รับที่ @Hannu คุณจะเจาะจงมากกว่านี้ได้ไหม? sort --parallel = 2 ไม่ได้ทำให้ขนานกัน ไม่ใช่ 4 หรือ 8 nproc ให้กลับ 48 อย่างที่ควรจะเป็น
Jeremy Kemball

1
ฉันว่า ... อย่าใช้ coreutils สำหรับสิ่งนี้ ตลกขบขันเรามีคำถามที่คล้ายกันมากและดี .... ทุกวิธีการอื่นทำงานได้ดีขึ้นsuperuser.com/a/485987/10165
Journeyman Geek

คำตอบ:


24

การจัดเรียงไม่ได้สร้างเธรดเว้นแต่ว่ามันจะต้องมีและสำหรับไฟล์ขนาดเล็กมันเป็นค่าใช้จ่ายมากเกินไป ตอนนี้โชคไม่ดีที่ตอนนี้เรียงไฟล์ไปป์เหมือนไฟล์เล็ก ๆ หากคุณต้องการป้อนข้อมูลให้เพียงพอถึง 24 เธรดคุณจะต้องระบุเพื่อจัดเรียงเพื่อใช้บัฟเฟอร์ภายในขนาดใหญ่ (การจัดเรียงจะทำโดยอัตโนมัติเมื่อแสดงด้วยไฟล์ขนาดใหญ่) นี่คือสิ่งที่เราควรปรับปรุงบนอัปสตรีม (อย่างน้อยในเอกสารประกอบ) ดังนั้นคุณจะต้องการสิ่งที่ต้องการ:

(export LC_ALL=C; grep -E  <files> | sort -S1G --parallel=24 -u | wc -m)

หมายเหตุฉันได้ตั้งค่า LC_ALL = C สำหรับกระบวนการทั้งหมดเนื่องจากพวกเขาจะได้รับประโยชน์จากข้อมูลนี้)

BTW คุณสามารถตรวจสอบเธรดการเรียงลำดับได้ดังนี้:

watch -n.1 ps -C sort -L -o pcpu
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.