बड़ी वर्डलिस्ट में डुप्लिकेट को हटाने का सबसे तेज़ तरीका?


14

मुझे एक बड़ी वर्डलिस्ट को कम करने की आवश्यकता है। मैंने कई आदेशों की कोशिश की और सबसे तेजी से `अनइक` टूल में लिनक्स में कुछ शोध किया और एक बड़े मल्टी-जीबी टेक्स्टफाइल में डुप्लिकेट लाइनों को कैसे हटाया जाए? जहां वे समझाते हैं कि किसी शब्दसूची को काट देने का सबसे तेज़ तरीका उपयोग करना प्रतीत होता है awk

awk  --> O(n) ?
sort --> O(n log n) ?

हालाँकि, मैंने पाया कि यह सच नहीं है। यहाँ मेरे परीक्षण के परिणाम हैं:

time sort -u input.txt -o output.txt 
real    0m12.446s  
user    0m11.347s  
sys 0m0.906s**


time awk '!x[$0]++' input.txt > output.txt
real    0m47.221s  
user    0m45.419s  
sys 0m1.260s

इसलिए उपयोग sort -u3.7 गुना तेज है। ऐसा क्यों है? क्या समर्पण करने के लिए और भी तेज़ तरीका है?

*********** अपडेट करें ********

जैसा कि किसी ने टिप्पणियों में बताया है, यह हो सकता है कि मेरी वर्डलिस्ट पहले से ही कुछ हद तक हल हो गई थी। इस संभावना को बाहर करने के लिए मैंने random_number_wordlist_generator.py का उपयोग करके दो वर्डलिस्ट बनाए

List1 = 7 Mb  
List2 = 690 Mb

**Results AWK:**  
***List1***  
real    0m1.643s  
user    0m1.565s  
sys     0m0.062s

***List2***  
real    2m6.918s  
user    2m4.499s  
sys     0m1.345s

**Results SORT:**  
***List1***  
real    0m0.724s  
user    0m0.666s  
sys     0m0.048s

***List2***  
real    1m27.254s  
user    1m25.013s  
sys     0m1.251s

क्या ऐसा हो सकता है कि आपका इनपुट डेटा पहले से ही सॉर्ट हो जाए?
इरुवर

मैं संख्याओं के साथ एक यादृच्छिक सूची उत्पन्न करूँगा और यह सुनिश्चित करने के लिए जांच
करूंगा

2
बिग ओ अंकन के बारे में है कि क्या होता है जब इनपुट लंबाई अनंत तक पहुंचती है: यह आपको बताता है कि यह बड़े इनपुट के साथ एक एल्गोरिथ्म तराजू है। कुछ एल्गोरिदम छोटे इनपुट आकार पर बेहतर काम करते हैं।
ctrl-alt-delor

1
कार्लपी, आपने पहले या सॉर्ट को किस क्रम में निष्पादित किया था? फ़ाइल कैशिंग के कारण फर्क पड़ सकता है
iruvar

1
@karlpy: "मैंने फ़ाइल नाम बदल दिया है ..." यदि आपका मतलब है कि आपने फ़ाइल का नाम बदला है, तो यह काफी अच्छा नहीं है। किसी फ़ाइल का नाम बदलना पुराने नाम के साथ एक नए नाम को जोड़ता है, जो अभी भी उसी पुराने डेटा ब्लॉक की ओर इशारा करता है। यदि वे कैश किए गए थे, तो वे अभी भी कैश किए गए हैं। ISTM कि बेहतर तकनीक के लिए (1) फ़ाइल की एक प्रतिलिपि बनाना होगा, और फिर (2) एक फ़ाइल पर एक कमांड चलाने के लिए और (3) अन्य फ़ाइल पर अन्य कमांड चलाने के लिए।
स्कॉट

जवाबों:


4

आप गलत प्रश्न पूछ रहे हैं, या प्रश्न को गलत तरीके से और गलत स्टैक में पूछ रहे हैं, यह लोगों के लिए प्रोग्रामिंग / स्टैक-ओवरफ्लो में पूछने के लिए एक बेहतर प्रश्न है जो आपको awk और सॉर्ट के अंदर उपयोग किए गए एल्गोरिदम के आधार पर उत्तर देने के लिए है।

पुनश्च: हमें "ज़ोन इन";) में कुछ और विवरण देने के लिए nawk, mawk और gawk की भी आवश्यकता है; और मिनट, अधिकतम, औसत और मानक विचलन के साथ 100 बार प्रत्येक की तरह रन करें।

CompSci 210 से किसी भी मामले में वापस प्रश्न पर, यह उपयोग किए गए एल्गोरिदम के बारे में है। आकार के आधार पर सॉर्ट कई का उपयोग करता है, और यह मेमोरी से बाहर भाग जाने पर फ़ाइलों को बचाने के लिए अस्थायी फ़ाइलों में डिस्क को सहेजने के लिए हिट की गई मेमोरी की कमी, और आपको यह देखने के लिए स्रोत कोड देखना होगा कि क्या देखना है आपके द्वारा चलाए जा रहे विशिष्ट OS पर विशिष्ट सॉर्ट (1) कमांड का उपयोग करता है, लेकिन अनुभव से यह मेमोरी में लोड हो रहा है जितना यह कर सकता है, इस पर कुछ त्वरित-सॉर्ट करें, डिस्क पर लिखें, बार-बार दोहराएं, और अंत में यह छोटे सॉर्ट की गई फ़ाइलों का मर्ज-सॉर्ट करेगा। तो यहाँ आपको भागों के लिए O (n * log2 (N)), और फिर एक अनुमानित O (n * log (n)) विलय कार्य

awk: x [$ 0] ++ तंत्र हैशिंग का उपयोग करने के लिए "मान लीजिए" है। एक हे (1) "लुकअप" ऑपरेशन, हैशिंग के साथ समस्या को टालना, टकराव और टकरावों से निपटना है। यह तब समस्या पैदा कर सकता है जब डेटा अच्छी तरह से नहीं फैलता है, और न ही बाल्टी आदि को भरने और बड़ी सूचियों में, हैशिंग एक बड़ी मेमोरी समस्या हो सकती है यदि टकरावों से निपटना सही नहीं किया गया है (और आपको आवश्यकता हो सकती है अपेक्षित डेटा के लिए हैशिंग एल्गोरिदम को ट्यून करें), और फिर आपको वास्तविक हैशिंग कार्यों के प्रदर्शन को देखने की जरूरत है और फिर ओ (1) आवेषण के लिए एक ओ (लॉग (एन)) के करीब हो सकता है (यानी। ओ) (1) पहली खोज के लिए, और यदि यह मौजूद नहीं है तो आप इसे जोड़ते हैं जो O (लॉग (n)) हो सकता है, और फिर n * O (1) एक * O (लॉग (n)) = बन जाता है > O (n * log (n)), उल्लेख नहीं करने के लिए भी आप "व्याख्या" तरीके से काम कर रहे हैं :)


awkभी, और महत्वपूर्ण रूप से, व्हाट्सएप पर प्रत्येक पंक्ति को डिफ़ॉल्ट रूप से विभाजित करता है। इसमें समय लगता है।
कुसलानंद

जब आप राम और डिस्क I / O सीमा से
टकरा रहे हैं तो @Kusalananda

0

मैं कठिन काम के लिए sort -u(संभवतः आगे के स्विच के साथ!) का उपयोग करना चाहूंगा , कुछ गंभीर स्क्रिप्टिंग भाषा को तोड़ने से पहले (पायथन / पर्ल / राकु, बहुत संभवत: छंटाई के बाद), और केवल अत्यंत गति की आवश्यकता को देखने के बाद। अन्य विकल्पों पर विचार करें।


-2

गति अंतर इसलिए है क्योंकि 'सॉर्ट' एक कमांड ( लिंक ) है, जबकि 'ऑक' एक प्रोग्रामिंग भाषा ( लिंक ) है।

'सॉर्ट' कमांड इनपुट और रिटर्न आउटपुट लेता है। जबकि 'awk' एक प्रोग्रामिंग भाषा है, जो पहले कोड (टर्मिनल कमांड) की व्याख्या करती है और फिर उस पर प्रोसेसिंग शुरू करती है। इतना ही आसान।

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