2012-02-26 24 views
11

मेरे पास कुछ बड़ी फ़ाइलें हैं (सैकड़ों एमबी) जिन्हें मुझे कई हजार ~ 20-वर्ण अद्वितीय तारों की खोज करने की आवश्यकता है।वैकल्पिकता का उपयोग करके मैं कितने नियमित अभिव्यक्तियों को एक साथ जोड़ सकता हूं?

मैंने पाया कि (string1|string2|string3) रेगुलर एक्सप्रेशन से मेल खाते के लिए पाइप प्रत्यावर्तन metacharacter का उपयोग कर खोज प्रक्रिया एक बहुत (एक समय में एक स्ट्रिंग के लिए खोज की तुलना में) को गति।

यह कैसे अच्छी तरह से स्केल करेगा करने के लिए सीमा क्या है? मैं इस तरह एक साथ कितनी अभिव्यक्ति कर सकता हूं? क्या यह किसी बिंदु पर किसी प्रकार का अतिप्रवाह पैदा करेगा? क्या ऐसा करने के लिए इससे अच्छा तरीका है?

संपादित

मेरे सवाल का संक्षिप्त रखने के प्रयास में, मैं तथ्य यह है कि मैं पहले से ही इस प्रत्यावर्तन दृष्टिकोण का उपयोग कर क्रियान्वित कर चुके हैं पर जोर नहीं था और मैं इसे उपयोगी हो पाया: एक टेस्ट केस पर एक सामान्य डेटा सेट के साथ, चलने का समय 87 मिनट से 18 सेकेंड तक घटा दिया गया - एक 290x स्पीडअप, जाहिर है ओ (एन * एम) के बजाय ओ (एन) के साथ।

मेरे सवाल यह है कि इस दृष्टिकोण जब अन्य उपयोगकर्ताओं बड़ा फ़ाइलें और अधिक खोज शब्दों के साथ बहुत बड़ा डेटा सेट का उपयोग भविष्य में इस कोड को चलाने के काम करने के लिए उम्मीद की जा सकती से संबंधित है। मूल ओ (एन * एम) कोड मौजूदा कोड था जो कि 13 वर्षों तक उपयोग में है, और इसकी नींद हाल ही में बताई गई थी क्योंकि जीनोम से संबंधित डेटा सेटों ने हाल ही में इसे बहुत बड़ा हासिल किया है।

+4

आप इसे क्यों नहीं आज़माते हैं और हमें परिणाम बताते हैं? – Kevin

+0

यह अजीब बात है: मेरे परिणाम बिल्कुल विपरीत थे, यह सिर्फ एक विकल्प के मुकाबले कई अलग-अलग खोज करने के लिए _much_ तेज था।क्या मैं आपको अपने कोड के बारे में कुछ और बताने का सुझाव दे सकता हूं? – raina77ow

+1

[Regexp :: Assemble] में से एक का उपयोग करें (http://metacpan.org/module/Regexp::Assemble), [Regexp :: Trie] (http://metacpan.org/module/Regexp::Trie) , [रेगेक्स :: प्रीसफ] (http://metacpan.org/module/Regex::PreSuf) अधिक कुशल परिवर्तनों को इकट्ठा करने के लिए – obmib

उत्तर

6

आप की तरह एक साधारण नियमित अभिव्यक्ति है (word1 | WORD2 | ... | wordn), regex इंजन एक राज्य मशीन है कि सिर्फ एक बार इनपुट से अधिक पारित कर सकते हैं का निर्माण करेगी यह पता लगाने के लिए कि स्ट्रिंग मेल खाता है या नहीं।

साइड-ध्यान दें: ऐसी है कि सैद्धांतिक कंप्यूटर विज्ञान में, "नियमित अभिव्यक्ति" एक तरह से परिभाषित कर रहे हैं एक भी पास हमेशा पर्याप्त है। हालांकि, व्यावहारिक रेगेक्स कार्यान्वयन उन सुविधाओं को जोड़ता है जो रेगेक्स पैटर्न के निर्माण की अनुमति देते हैं जिन्हें हमेशा एक पास (see this example) के रूप में लागू नहीं किया जा सकता है।

फिर, नियमित अभिव्यक्ति के अपने पैटर्न के लिए, इंजन लगभग निश्चित रूप से एक भी पास का उपयोग होगा। यह संभवतः स्मृति से डेटा को कई बार पढ़ने से तेज़ होने जा रहा है ... और डिस्क से डेटा को कई बार पढ़ने से लगभग निश्चित रूप से बहुत तेज है।

3

तुम सिर्फ फार्म की नियमित अभिव्यक्ति के लिए जा रहे हैं (word1 | WORD2 | .... | wordn), क्यों सिर्फ बूलियन्स का एक संबद्ध सरणी का निर्माण नहीं। यह बहुत तेज़ होना चाहिए।

संपादित

# before the loop, set up the hash 

%words = (
    cat => 1, 
    dog => 1, 
    apple => 1, 
    .... etc 
); 

# A the loop to check a sentence 

foreach $aword (split(/ /, $sentence)) 
    if ($words{$aword}) print "Found $aword\n"; 
+0

इसके लिए कृपया एक कोड उदाहरण जोड़ें। – daxim

+0

@daxim - कोड के लिए हड्डियों। –

+0

मुझे लगता है कि यह दृष्टिकोण छोटे डेटा सेटों के लिए अच्छी तरह से काम करेगा जो पूरी तरह से खोज से पहले स्मृति में लोड हो जाते हैं। – rmtheis

2

नियमित अभिव्यक्ति की सीमा तक कोई सैद्धांतिक सीमा नहीं है, लेकिन व्यावहारिक रूप से यह एक विशिष्ट मंच और स्थापना की सीमाओं के भीतर फिट होना चाहिए। आपको अनुभव करना होगा कि आपकी योजना काम करेगी, और मैं आपके परिणामों को देखने में प्रसन्न हूं।

एक बात मैं कहूँगा कि आप अभिव्यक्ति अलग से संकलन करना चाहिए इससे पहले कि आप इसका इस्तेमाल करने पर जाना है। या तो /o विकल्प को एक बार संकलित करने के लिए या लागू करें (यानी वादा करता हूं कि अभिव्यक्ति की सामग्री बदलेगी नहीं)। कुछ इस तरह की

my $re = join '|', @strings; 

foreach my $file (@files) { 
    my $fh = IO::File->new($file, '<') or die "Can't open $file: $!"; 
    while (<$fh>) { 
    next unless /\b(?:$re)\b/io; 
    chomp; 
    print "$_ found in $file\n"; 
    last; 
    } 
} 
संबंधित मुद्दे

 संबंधित मुद्दे