सॉर्ट करें - समानांतर समानांतर नहीं है


10

मैं एक फ़ाइल से egrep के साथ eg -p के साथ खींची गई लाइनों का एक सेट बनाने की कोशिश कर रहा हूं, फिर उन्हें गिनें। लगभग 10% लाइनें (वर्णमाला [ATCG] से लंबी सभी 100 वर्ण) दोहराई जाती हैं। दो फाइलें हैं, प्रत्येक के बारे में 3 गिग्स, 50% प्रासंगिक नहीं हैं, इसलिए शायद 300 मिलियन लाइनें।

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

LC_ALL = C और उपयोग -x के बीच grep को तेज करने के लिए, अब तक का सबसे धीमा हिस्सा है। मैन पेजों को पढ़ने से मुझे - समांतर = n पर ले जाया गया, लेकिन प्रयोग में बिल्कुल सुधार नहीं हुआ। शीर्ष के साथ थोड़ी खुदाई से पता चला है कि यहां तक ​​कि - 24 समानांतर = 24 के साथ, सॉर्ट प्रक्रिया केवल एक समय में एक प्रोसेसर पर चलती है।

मेरे पास 6 कोर और 2 थ्रेड्स / कोर के साथ 4 चिप्स हैं, जो कुल 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

मैं क्या खो रहा हूँ? यहां तक ​​कि अगर प्रक्रिया आईओ-बाउंड है, तो क्या मुझे वैसे भी समानांतर प्रसंस्करण नहीं देखना चाहिए? सॉर्ट प्रक्रिया 99% प्रोसेसर का उपयोग करती है जो वास्तव में किसी भी समय पर होती है, इसलिए यदि ऐसा हो रहा है, तो मुझे समानांतर देखने में सक्षम होना चाहिए। मेमोरी चिंता का विषय नहीं है, मेरे पास खेलने के लिए 256 जीबी है और इसमें से किसी भी चीज का उपयोग नहीं किया जाता है।

मैंने कुछ फ़ाइल में पाइपिंग grep की खोज की, फिर फ़ाइल को सॉर्ट के साथ पढ़ा:

 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-उबंटू एसएमपी" देता है और lsb_release -a14.04.2 कोडनेम भरोसेमंद, और सॉर्ट के संस्करण का दावा करता है कि के अनुसार ग्नू कोर्यूटिल्स का हिस्सा है man sort
जेरेमी केमबॉल

ऐसा लगता है कि यहाँ कुछ अंश हैं जिन्हें पुनः पढ़ने की आवश्यकता है: gnu.org/software/coreutils/manual/html_node/…
हन्नू

मुझे यकीन नहीं है कि मैं समझता हूं कि आप @ हनु में क्या प्राप्त कर रहे हैं, क्या आप अधिक विशिष्ट हो सकते हैं? सॉर्ट करें - समानांतर = 2 या तो समानांतर नहीं है। न तो 4 या 8. nproc वापस 48 देता है जैसे उसे चाहिए।
जेरेमी केमबॉल

1
मैं कहता हूँ ... इस के लिए coreutils का उपयोग न करें। Amusingly हम एक बहुत ही इसी तरह के सवाल था और अच्छी तरह से .... हर दूसरे विधि बेहतर काम करता है superuser.com/a/485987/10165
जर्नीमैन गीक

जवाबों:


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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.