2016-04-12 4 views
5

मैं एक dimacs पर instaparse उपयोग करने के लिए कोशिश कर रहा हूँ आकार में कम से कम 700k फ़ाइल, निम्नलिखित व्याकरणइंस्टैपर्स को गति देने का कोई तरीका?

<file>=<comment*> <problem?> clause+ 
comment=#'c.*' 
problem=#'p\s+cnf\s+\d+\s+\d+\s*' 
clause=literal* <'0'> 
<literal>=#'[1-9]\d*'|#'-\d+' 

तो

(def parser 
    (insta/parser (clojure.java.io/resource "dimacs.bnf") :auto-whitespace :standard)) 
... 
(time (parser (slurp filename))) 

तरह बुला के साथ और यह एक सौ सेकंड के बारे में ले रहा है। मैं अपेक्षा की तुलना में धीमी गति के तीन आदेश धीमा कर रहा था। क्या इसे गति देने का कोई तरीका है, व्याकरण को बदलने का कोई तरीका या कुछ विकल्प जो मुझे याद आ रहा है?

उत्तर

2

व्याकरण गलत है। यह संतुष्ट नहीं हो सकता है।

  • प्रत्येक fileclause के साथ समाप्त होता है।
  • प्रत्येक clause'0' के साथ समाप्त होता है।
  • clause में greedy reg-exp होने पर, अंतिम '0' खाएगा।

निष्कर्ष: clause कभी मिलेगा।

उदाहरण के लिए ...

=> (parser "60") 
Parse error at line 1, column 3: 
60 
^
Expected one of: 
"0" 
#"\s+" 
#"-\d+" 
#"[1-9]\d*" 

हम एक literal

=> (parser "60" :start :literal) 
("60") 

पार्स कर सकते हैं ... लेकिन नहीं एक clause

=> (parser "60" :start :clause) 
Parse error at line 1, column 3: 
60 
^
Expected one of: 
"0" (followed by end-of-string) 
#"\s+" 
#"-\d+" 
#"[1-9]\d*" 

डब्ल्यू हाय क्या यह इतना धीमा है?

यदि वहाँ एक comment:

  • यह पूरी फ़ाइल निगल कर सकते हैं;
  • या किसी भी 'c' चरित्र पर लगातार comment एस में टूटा हुआ हो;
  • या शुरुआती 'c' के बाद किसी भी बिंदु पर को समाप्त करें।

इसका मतलब है कि हर पूंछ व्याकरण, जो literal के लिए एक रेग-exp कि Instaparse अंदर नहीं देख सकते हैं शामिल हैं के बाकी के समक्ष प्रस्तुत किया है।इसलिए सभी को आजमाया जाना है, और अंत में सभी असफल हो जाएंगे। कोई आश्चर्य नहीं कि यह धीमा है।


मुझे लगता है कि इस फाइल को वास्तव में लाइनों में बांटा गया है। और यह कि आपकी समस्याएं सफेद-अंतरिक्ष के अन्य रूपों के साथ न्यूलाइन को भंग करने की कोशिश करने से उत्पन्न होती हैं।

क्या मैं धीरे-धीरे बता सकता हूं कि कुछ छोटे उदाहरणों के साथ खेलना - जो मैंने किया है - शायद आपको परेशानी का सामना करना पड़े।

0

मुझे लगता है कि * का आपका व्यापक उपयोग समस्या पैदा कर रहा है। आपका व्याकरण बहुत संदिग्ध/महत्वाकांक्षी है (मुझे लगता है)।

;;run it as 
(insta/parses grammar input) 
;; with a small input 

कि तुम्हें दिखाता कितना अस्पष्टता अपने व्याकरण परिभाषा है: check "अस्पष्ट व्याकरण" मैं दो बातों की जांच करेंगे।

Engelberg performance notes पढ़ें, यह आपकी अपनी समस्या को समझने में मदद करेगा और शायद यह पता लगाएगा कि आपके लिए सबसे अच्छा क्या है।

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