बड़ी फ़ाइलों को कैसे सॉर्ट करें?


35

मेरे पास Intel (R) Pentium (R) CPU G640 @ 2.80 GHz और 8 GB RAM वाला पीसी है। मैं EXT3 फाइल सिस्टम के साथ इस पर वैज्ञानिक लिनक्स 6.5 चला रहा हूं।

इस सेटअप पर, मैं sort -u200 गीगाबाइट फ़ाइल पर सबसे तेज़ तरीका क्या कर सकता हूं ?

क्या मुझे फ़ाइल को छोटी फ़ाइलों (8 जीबी से छोटी) में विभाजित करना चाहिए, sort -uउन्हें, उन्हें एक साथ रखना, फिर उन्हें फिर से एक अलग आकार में विभाजित करना, sort -uफिर से, आदि? या कोई सॉर्टिंग स्क्रिप्ट्स, प्रोग्राम हैं जो मेरी सीमित मात्रा में रैम के साथ इस बड़ी फाइल को संभाल सकते हैं?


6
कृपया अपने प्रश्न को संपादित करें और बताएं कि जब आप कमांड पोस्ट करते हैं तो क्या होता है। क्या आप डिस्क स्थान से बाहर भागते हैं? जब तक आपके पास पर्याप्त खाली स्थान है, तब तक कमांड को काम करना चाहिए /tmp
terdon


1
चुने हुए उत्तर मूल रूप से कहते हैं कि @terdon क्या कह रहा है, लेकिन यह भी देखें - एक stackoverflow.com/a/13025731/2801913 । आपको इसके parallelलिए जीएनयू की आवश्यकता होगी जो मुझे लगता है parallelकि कुछ सिस्टम पर डिफ़ॉल्ट रूप से स्थापित किए गए अधिक्यूटाइल के बजाय है ।
ग्रीम

1
आप फ़ाइल को अमेज़ॅन S3 पर अपलोड कर सकते हैं, फिर इसे हल करने के लिए कुछ सौ नोड्स के साथ एक इलास्टिक मैप रिड्यूस जॉब को स्पिन करें!
एलन शटको

2
sort(1)पर अंतरिक्ष से बाहर चला सकता है /tmp; यदि हां, तो आप पर्यावरण चर TMPDIR, या ध्वज के साथ अस्थायी फ़ाइलों के लिए एक और क्षेत्र नामित कर सकते हैं-T=<tmpdir>
vonbrand

जवाबों:


46

GNU sort(जो कि अधिकांश लिनक्स सिस्टम पर डिफ़ॉल्ट है) में एक --parallelविकल्प है। से http://www.gnu.org/software/coreutils/manual/html_node/sort-invocation.html :

'--Parallel = एन'

N के समानांतर चलने वाले प्रकारों की संख्या निर्धारित करें। डिफ़ॉल्ट रूप से, n उपलब्ध प्रोसेसर की संख्या पर सेट है, लेकिन 8 तक सीमित है, क्योंकि उसके बाद प्रदर्शन में कमी आ रही है। ध्यान दें कि n थ्रेड्स का उपयोग करने से लॉग एन के एक कारक द्वारा मेमोरी का उपयोग बढ़ जाता है। इसके अलावा nproc मंगलाचरण देखें।

चूंकि आपके सीपीयू में 2 कोर हैं, आप ऐसा कर सकते हैं:

sort --parallel=2 -uo list-sorted.txt list.txt

हाइपर-थ्रेडिंग के कारण प्रोसेसर के अधिक दिखने के बाद से कोर की वास्तविक संख्या को निर्दिष्ट करना बेहतर है ।

आप niceप्रोसेसर शेड्यूलिंग प्राथमिकता ioniceको प्रभावित करने और I / O शेड्यूलिंग को प्रभावित करने के लिए भी प्रयोग कर सकते हैं । आप इस तरह की अन्य प्रक्रियाओं पर प्राथमिकता बढ़ा सकते हैं, मुझे नहीं लगता कि यह आपको बड़ी बचत देगा क्योंकि वे आमतौर पर यह सुनिश्चित करने के लिए बेहतर होते हैं कि पृष्ठभूमि प्रक्रिया बहुत अधिक संसाधनों का उपयोग नहीं करती है । कभी-कम-आप उन्हें कुछ के साथ जोड़ सकते हैं जैसे:

nice -n -20 ionice -c2 -n7 sort --parallel=2 -uo list-sorted.txt list.txt

यह भी ध्यान दें कि जैसा कि गाइल्स ने टिप्पणी की थी, एक एकल GNU सॉर्ट कमांड का उपयोग करना छंटाई को तोड़ने के किसी भी अन्य तरीके की तुलना में तेज़ होगा क्योंकि एल्गोरिथम पहले से ही बड़ी फ़ाइलों को संभालने के लिए अनुकूलित है। किसी भी चीज की संभावना सिर्फ धीमी चीजें होंगी।


10
और आपको ध्यान देना चाहिए कि कॉलिंग sortसीधे किसी भी चीज़ से बेहतर है जिसे आप कोबल कर सकते हैं। GNU सॉर्ट को उन फ़ाइलों के साथ अच्छी तरह से सामना करने के लिए डिज़ाइन किया गया है जो रैम से बहुत बड़ी हैं।
गिल्स एसओ- बुराई को रोकना '

समांतर सॉर्ट विकल्प मेरे RH6.5 सर्वर पर काम नहीं करता है। सॉर्ट --version सोचता है कि यह कोरुटिल्स 8.4 से निकलता है। समानांतर संस्करण के लिए मुझे किस संस्करण की आवश्यकता है?
markus_b

3
यह भी देखें कि superuser.com/questions/938558/sort-parallel-isnt-parallelizing - आपको कुछ चीज़ों को निर्दिष्ट करना पड़ सकता है -S512M यदि आप ध्यान दें कि यह वास्तव में समानांतर नहीं है।
अनहैमर

46

sortकमांड का उपयोग करना शायद सबसे तेज विकल्प होगा।

लेकिन आप शायद लोकेल को सी को ठीक करना चाहेंगे।

sort -uअद्वितीय लाइनों की रिपोर्ट नहीं करता है, लेकिन लाइनों के प्रत्येक सेट में से एक जो समान क्रमबद्ध करता है। सी लोकेल में, 2 अलग-अलग लाइनें आवश्यक रूप से समान नहीं होती हैं, लेकिन GNU सिस्टम पर अधिकांश UTF-8 आधारित स्थानों में ऐसा नहीं है।

इसके अलावा, C लोकेल का उपयोग करने से UTF-8 को पार्स करने और जटिल प्रकार के आदेशों को संसाधित करने के ओवरहेड से बचा जाता है ताकि प्रदर्शन में नाटकीय रूप से सुधार हो सके।

इसलिए:

LC_ALL=C sort -u file

अस्थायी फ़ाइलों (उपयोग -Tया $TMPDIRपर्यावरण चर) के लिए, या -Sकुछ sortकार्यान्वयनों द्वारा समर्थित विकल्प के साथ फ़िडलिंग करके आप तेज़ ड्राइव (या इनपुट और / या आउटपुट फ़ाइल से भिन्न ड्राइव) का उपयोग करके प्रदर्शन में सुधार कर सकते हैं। ।

किसी प्रकार के इनपुट के लिए या धीमे स्टोरेज के लिए, --compress-programGNU के विकल्प का उपयोग करके sort(उदाहरण के लिए lzop) भंडारण उपयोग के अलावा प्रदर्शन में सुधार हो सकता है।


अब सिर्फ आपत्ति करने वालों (कुछ हद तक सही) के लिए एक नोट कि यह सही क्रम नहीं होगा :

मैं मानता हूँ कि एक इंसान के रूप में, मैं देखना चाहते हैं स्टीफन प्रकार के बीच में स्टीफन और स्टेफ़नी , लेकिन:

  • एक कंप्यूटर चाहता है कि स्टीफनé एक चरित्र या उसके UTF-8 एन्कोडिंग प्रकार के बाद (कोडपॉइंट या बाइट मान के रूप में) के रूप में (कम से कम जब U + 00E9 के रूप में व्यक्त किया गया है) के बाद से सॉर्ट करना चाहता है । यह एक क्रमबद्ध क्रम है जो लागू करने के लिए बहुत सरल है और एक सख्त कुल आदेश है और इसमें कोई आश्चर्य नहीं है।
  • आपके स्थान का क्रमबद्ध क्रम कई मामलों में संतोषजनक नहीं होगा, यहां तक ​​कि मानव के लिए भी। डिफ़ॉल्ट en_GB.utf8 लोकेल के साथ मेरे सिस्टम पर उदाहरण के लिए:

    • स्टीफन और स्टीफन (U + 00E9 के साथ एक, eU + 0301 के साथ अन्य) समान नहीं हैं:

      $ printf '%b\n' 'Ste\u0301phane' 'St\u00e9phane' | sort -u
      Stéphane
      Stéphane
      
    • लेकिन but, ①, sort सभी समान हैं (स्पष्ट रूप से उन स्थानीय परिभाषाओं में एक बग):

      $ printf '%s\n' ③ ① ② | sort -u
      ③
      

      यहाँ, यह ③ है, लेकिन यह सिर्फ ③ या ③ हो सकता है

तो IMO, संभावना है कि आप हमेशा sort -uLC_ALL = C के साथ चाहते हैं , यदि आप अद्वितीय लाइनें चाहते हैं। और यदि आप चाहते हैं कि परिणामी सूची को उपयोगकर्ता के क्रम में क्रमबद्ध किया जाए, तो उसे sortफिर से पाइप करें:

LC_ALL=C sort -u | sort

LC_ALL=C sort | LC_ALL=C uniq -c | sort -k2

8
लोकेल सेट करने के लिए +1: इसका प्रदर्शन पर भारी असर पड़ सकता है
एड्रियन प्रैंक

1
हाँ। 250000 लाइनों के साथ फ़ाइल को सॉर्ट करना LC_ALL 8 बार चीजों को गति देता है।
Jan Vlcinsky

-1

यहाँ जीबी रैम के जोड़े के साथ एक नियमित मशीन पर टीबी स्केल डेटा को सॉर्ट करने के लिए बैश स्क्रिप्ट का उपयोग करने के लिए तैयार है: http://sgolconda.blogspot.com/2015/11/sort-very-large-dataset.html यह चेक नंबर की जाँच करता है। के रूप में अपनी मशीन कोर और सभी कोर का उपयोग करता है। क्रमबद्ध, संख्यात्मक या स्ट्रिंग फ़ाइलें। टीबी स्केल डेटा में अद्वितीय रिकॉर्ड खोजने के लिए इस्तेमाल किया जा सकता है।


यह अच्छा सुझाव नहीं है। स्क्रिप्ट बेहद फूली हुई है और इनपुट फ़ाइल को उन भागों को छाँटने के लिए विभाजित करती है, जिन्हें स्वीकार किए गए उत्तर बिंदुओं को GNU सॉर्ट के साथ आवश्यक नहीं है।
थोरबजोरन रावन एंडरसन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.