विशाल फ़ाइलों के लिए 'सॉर्ट -u' की स्केलेबिलिटी


23

'सॉर्ट -यू' की उचित मापनीयता सीमा क्या है? ("लाइन की लंबाई", "लाइनों की मात्रा", "कुल फ़ाइल आकार" के आयामों में?)

"लाइनों की मात्रा" के आयाम में इसे पार करने वाली फ़ाइलों के लिए यूनिक्स विकल्प क्या है? (बेशक मैं आसानी से एक को लागू कर सकता हूं, लेकिन मुझे आश्चर्य है कि क्या ऐसा कुछ है जो कुछ मानक लिनक्स कमांडों के साथ किया जा सकता है?)


उन लोगों के लिए जो इसमें बाइनरी खोज करना चाहते हैं या जानते हैं कि कैसे: unix.stackexchange.com/q/247508/9689
Grzegorz Wierzowiecki

2
ऐसी स्थितियां हैं जहां मदद करने uniqसे पहले sort -u। BTW, ASCII डेटा के लिए LC_ALL=C sortGNU sortएक भयानक बहुत ( इस जवाब को देखें ) को गति देता है
वाल्टर ट्रॉस

जवाबों:


39

sortआप लिनक्स पर लगता है कि से आता है coreutils पैकेज और औजार एक बाहरी आर-वे मर्ज । यह डेटा को विखंडू में विभाजित करता है जिसे वह मेमोरी में संभाल सकता है, डिस्क पर संग्रहीत करता है और फिर उन्हें मर्ज करता है। चंक्स समानांतर में किया जाता है, अगर मशीन में उसके लिए प्रोसेसर हैं।

इसलिए यदि कोई सीमा होनी थी, तो यह मुफ्त डिस्क स्थान है जिसका sortउपयोग अस्थायी फ़ाइलों को संग्रहीत करने के लिए कर सकता है, जो परिणाम के साथ संयुक्त होता है।


3
ध्यान दें कि GNU सॉर्ट उन अस्थायी फ़ाइलों को और भी अधिक पैक करने के लिए संपीड़ित कर सकता है (और धीमी डिस्क के साथ प्रदर्शन बढ़ाता है)।
स्टीफन चेज़लस

1
@ StéphaneChazelas अपडेट के लिए धन्यवाद। मैं खुद सोच रहा था कि किसी तरह पूरी तरह से मर्ज होने पर चंक फ़ाइलों को हटाने के लिए सॉर्ट पर्याप्त था (जो कि आसानी से हो सकता है अगर स्रोत पहले से ही एक अंतरिक्ष अनुकूलन के रूप में सॉर्ट किया गया है)। मुझे इन दिनों स्रोत कोड में गोता लगाने का समय नहीं मिला है :-(
एंथन

3
मेमोरी के अलावा मर्ज चरण पर लागू होने वाली एक और सीमा भी है: एक साथ खुलने वाली फ़ाइलों की संख्या। यह आमतौर पर ऑपरेटिंग सिस्टम द्वारा लगाई गई सीमा है। GNU सॉर्ट करने के साथ-साथ उन फ़ाइलों की संख्या को पुन: विलय करके, जो एक बार में पुरानी हो सकती हैं!
डायोमिडिस स्पिनेलिस

@ स्टीफनचेज़ेलस यदि मैं विशेष रूप से बहुत बड़ी फ़ाइलों को छाँटने के लिए एक उपकरण डिज़ाइन कर रहा था, तो मैं मूल फ़ाइल में एक सूचकांक के रूप में लाइनों को संग्रहीत करूंगा। क्या GNU ऐसा करता है, या यह केवल एक पारंपरिक संपीड़न एल्गोरिथ्म का उपयोग करता है?
रैंडम 832

3
@ Random832 और इसका मतलब है कि फाइल को खुद से ओवरराइट करना ( sort -o file file)
स्टीफन चेज़लस

1

मैं विक्रेता विशिष्ट कार्यान्वयन के लिए बात नहीं कर सकता, लेकिन UNIX sortकार्यान्वयन बड़ी फ़ाइलों को छोटी फ़ाइलों में विभाजित करता है, इन फ़ाइलों को सॉर्ट करता है और फिर सॉर्ट की गई छोटी फ़ाइलों को एक समेकित क्रमबद्ध आउटपुट में जोड़ता है।

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


3
वास्तव में आप UNIX सॉर्ट कार्यान्वयन को क्या कहते हैं ? यह यूनिक्स संस्करण 3 से मूल एक है? वहां का मैन पेज कहता है कि यह 128KiB से बड़ी फ़ाइलों को सॉर्ट नहीं कर सकता है।
स्टीफन चेज़लस

यूनिक्स संस्करण 3 से आप क्या समझते हैं? 1973 से संस्करण? मूल UNIX सॉर्ट कार्यान्वयन को वर्षों और IIRC पर बढ़ाया गया है, सोलारिस संस्करण और भी तेज़ है तो GNU संस्करण। बेशक, 25 साल पहले सॉर्ट मल्टी-बाइट पात्रों को समझने के लिए बढ़ाया गया था और मुझे एक USENET चर्चा से याद है, यह था कि यह सोलारिस पर कुशलता से किया गया है। BTW: बड़ी फ़ाइल के रूप में man largefileसूचीबद्ध sortजानकारी।
विद्वान

2
तो क्या आप वास्तव में Oracle विक्रेता विशिष्ट संस्करण की बात कर रहे हैं sort? या एटी एंड टी यूनिक्स के कुछ संस्करण के किसी भी व्युत्पन्न प्रकार? या के किसी भी यूनिक्स प्रमाणित संस्करण sort(जैसे sortओएस / एक्स पर जीएनयू )?
स्टीफन चेजालस

sortमल्टी-बाइट चार्ट के संबंध में आधुनिक कार्यान्वयन की गुणवत्ता अलग-अलग हो सकती है, यह तथ्य कि sortविभाजन की मध्यवर्ती फ़ाइलों का उपयोग सभी UNIX कार्यान्वयनों के लिए सामान्य है जो मूल कोड पर आधारित हैं। BTW: सोलारिस संस्करण OSS "ओपनसोलारिस" के रूप में है, देखें sourceforge.net/p/schillix-on/schillix-on/ci/default/tree/usr/…
schilyn

25 साल पहले, UTF-8 का अभी तक आविष्कार नहीं किया गया था? यूटीएफ -8 स्थानों के लिए समर्थन सोलारिस 7 ( 1 , 2 ) में जोड़ा गया था । क्या आप कुछ अन्य मल्टीबाइट कैरेक्टर सेट की बात कर रहे हैं?
स्टीफन चेज़लस

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स्निपेट का उल्लेख पहले से ही करता है - यानी एक्सटर्नल आर-वे मर्ज । तो बस चलने के बाद:

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

पर्याप्त होना चाहिए।

सीमा के बारे में मेरी वर्तमान धारणाएं (कोड की जाँच किए बिना) हैं:

  • अधिकतम लाइन की लंबाई भौतिक मेमोरी की मात्रा द्वारा सीमित है। सॉर्ट करने के लिए कम से कम दो मेमोरी में फिट होना चाहिए
  • लाइनों की राशि - मुझे जानकारी नहीं है
  • फ़ाइल का आकार - बेशक फाइल सिस्टम द्वारा
  • ऑपरेटिंग सिस्टम के आधार पर समानांतर में खोली गई फ़ाइलों की मात्रा ( यह इंगित करने के लिए धन्यवाद डायोमिडिस स्पिनेलिस !)

(यह उत्तर सामुदायिक विकि के रूप में चिह्नित है - इसे बेहतर बनाने के लिए प्रोत्साहित महसूस करें! :))


2
जीएनयू sortडिफ़ॉल्ट रूप से समानांतर में होता है (2010 के बाद से उस पृष्ठ के बाद आप जिससे लिंक कर रहे हैं), इष्टतम --parallelको sortनिर्धारित करने के बजाय समवर्ती धागे की संख्या को कम करना है । सॉर्ट पहले से ही एक विभाजन और आंतरिक रूप से अधिक कुशल तरीके से विलय करता है। मुझे संदेह है कि अतिरिक्त विभाजन से मदद मिलेगी।
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.