एक सूचकांक का उपयोग कर तेज बनाने के लिए?


10

मैं खुद को एक ही कोडबेस को बार-बार देखता हूं। जब यह महान काम करता है, तो प्रत्येक कमांड में लगभग 10 सेकंड लगते हैं, इसलिए मैं इसे तेजी से बनाने के तरीकों के बारे में सोच रहा हूं।

तो grepकिसी प्रकार के सूचकांक का उपयोग कर सकते हैं? मुझे लगता है कि एक सूचकांक शायद जटिल रेगेक्स के लिए मदद नहीं करेगा, लेकिन मैं ज्यादातर बहुत सरल पेटेंट का उपयोग करता हूं। क्या इस मामले के लिए एक इंडेक्स मौजूद है?

संपादित करें: मैं ctags और इस तरह के बारे में जानता हूं, लेकिन मैं पूर्ण-पाठ खोज करना चाहूंगा।


क्या आप grep के लिए पुनरावर्ती oprtion का उपयोग कर रहे हैं या कुछ खोज / xargs की तरह है?
मिशैल Šrajer

@ माइकेल: हाँ, -R
पेल्टियर

जवाबों:


4

cscope के बारे में क्या , यह आपके जूते से मेल खाता है?

इसके लिए खोज कोड की अनुमति देता है:

  • एक प्रतीक के सभी संदर्भ
  • वैश्विक परिभाषाएँ
  • फ़ंक्शन द्वारा बुलाया गया कार्य
  • फ़ंक्शन कॉल करने वाले फ़ंक्शन
  • पाठ की पंक्ति
  • नियमित अभिव्यक्ति पैटर्न
  • एक पंक्ति
  • एक फ़ाइल सहित फ़ाइलें

कि मैं क्या देख रहा हूँ, मैं देख सकता हूँ। धन्यवाद!
Peltier

ऐसा लगता है कि यह सिर्फ सी, हो सकता है सी ++ और जावा के लिए अच्छी तरह से काम करता है
नेवेस

4

पूर्ण-पाठ अनुक्रमण

ऐसे उपकरण हैं जैसे कि recoll , swish-e और sphinx लेकिन आपको यह जांचना होगा कि क्या वे आपके द्वारा आवश्यक खोज मानदंडों का समर्थन कर सकते हैं।

Recoll

रिकॉल यूनिक्स / लिनक्स के लिए एक व्यक्तिगत पूर्ण पाठ खोज उपकरण है।

बेंत की मार-ए

वेब पेज या अन्य फ़ाइलों के संग्रह को अनुक्रमण के लिए स्विश-ई एक तेज, लचीला और मुफ्त खुला स्रोत प्रणाली है।

गूढ़ व्यक्ति

स्फिंक्स आपको या तो बैच इंडेक्स और SQL डेटाबेस, NoSQL स्टोरेज, या बस फाइलों को जल्दी और आसानी से संग्रहीत करने के लिए खोज डेटा देता है

ग्रेप

मुझे आश्चर्य है कि grep आपके वर्णन के अनुसार धीमा है, क्या आप खोज की जा रही फ़ाइलों की संख्या कम कर सकते हैं? उदाहरण के लिए जब मुझे केवल एक निष्पादन योग्य (किसी परियोजना में कई में से) के लिए स्रोत फ़ाइलों को खोजने की आवश्यकता होती है, तो मैं उस प्रोग्राम से स्रोत फ़ाइलों को सूचीबद्ध करने वाली कमांड से नाम को संक्षिप्त करता हूं:

grep expression `sources myprogram`

sources मेरे विकास के माहौल के लिए एक कार्यक्रम विशिष्ट है लेकिन आपके पास (या निर्माण करने में सक्षम) कुछ समतुल्य हो सकता है।

मैं मान रहा हूं कि आपने स्पष्ट तकनीकें आजमाई हैं

find /foo/myproject -name "*.c" -exec fgrep -l searchtext

मैंने एक सुझाव पढ़ा है कि -Pकरंट का विकल्प grepखोजों को काफी तेज़ कर सकता है।


1
AFAIK का पता केवल फ़ाइल नाम के लिए है। काम करना होगा, लेकिन मैं एक कमांड लाइन उपकरण पसंद करेंगे। कोड आधार बहुत बड़ा है, और जब से मैं एक स्ट्रिंग की तलाश में हूं, मुझे नहीं पता कि यह कहां है, इसलिए खोज की जाने वाली फाइलों की संख्या को सीमित करना मुश्किल है :)
पेल्टियर

मुझे लगता है कि swish-e कमांड-लाइन है। मैंने कोई कोशिश नहीं की है (मेरे प्रोजेक्ट्स पर grep काफी तेज़ है)
RedGrittyBrick

3

grep, नहीं। लेकिन कई प्रोग्राम हैं जो इंडेक्स का उपयोग करते हैं और कोड बेस के उद्देश्य से हैं। ctags(वहाँ एक संस्करण विम के साथ प्रदान किया गया है), etags(emacs के साथ प्रयोग के लिए लक्षित), global(संपादक से अधिक स्वतंत्र) एक मैं अब के बारे में सोच रहा हूँ, लेकिन वहाँ शायद अन्य हैं।


मैं ctags का उपयोग करता हूं, लेकिन यह फ़ंक्शन नाम खोजने तक सीमित नहीं है? मैं पूर्ण-पाठ खोज करना चाहता हूं।
पेल्टियर

मुझे पूरा यकीन है कि ctag क्लास की परिभाषा और ISTR की खोज भी कर सकता है कि यह कुछ उपयोग भी पाता है। मुझे यकीन है कि वैश्विक दोनों करते हैं। लेकिन यह सच है कि वे उपकरण पूर्ण-पाठ खोज नहीं करते हैं और अपने दायरे को सीमित करने के लिए भाषा ज्ञान का उपयोग कर रहे हैं।
AProgrammer

3

आप अपने कोडबेस को रैम डिस्क पर कॉपी कर सकते हैं।


2

यदि आप एक पूर्ण खोज इंजन का उपयोग करना चाहते हैं .. एक का उपयोग करें:


यह हमेशा एक विकल्प होता है, लेकिन मैं सोच रहा था कि अधिक हल्के, त्वरित और गंदे grep स्पीडअप विकल्प मौजूद होंगे।
Peltier

'अधिक हल्के' लेकिन 'चाहते हैं कि मेरा सामान पूरी तरह से अनुक्रमित हो' 2 चरम सीमाएं हैं :) ctags जो आप चाहते हैं उसके लिए सबसे अच्छा मैच है, अगर आप बस एक गंदा जाना चाहते हैं। बाकी सब कुछ के साथ आप एक वास्तविक फुलटेक्स्ट-सर्च-इंजन का उपयोग करते हुए समाप्त होते हैं। उदाहरण के लिए, @RedGrittyBrick उत्तर में वर्णित 'रिकॉल' बैकेंड के रूप में जपियन का उपयोग कर रहा है।
अकीरा

1
वे जरूरी असंगत नहीं हैं। कल्पना कीजिए कि अगर ctags में एक --full-टेक्स्ट विकल्प होता है, उदाहरण के लिए, और gtp a -tag-file विकल्प। निश्चित रूप से यह मौजूद हो सकता है कि इसका मतलब यह नहीं है कि यह :)
पेल्टियर

-1

नहीं, मुझे ऐसा नहीं लगता। लेकिन एक सरल समाधान हो सकता है: ऐक प्रयास करें। मुझे लगता है कि अगर आप इसे एक मौका देते हैं, तो आप इसे grep की तुलना में काफी तेज पाएंगे, बेहतर खोज परिणामों को प्राप्त करने के लिए छोटी खोज स्ट्रिंग्स की आवश्यकता होती है, और कई वांछनीय विशेषताएं हैं, जबकि एक ही कमांड स्विच का उपयोग करते हुए। एक चीज़ जो इसे तेज़ बनाती है (हालाँकि अनुक्रमणित नहीं है) यह है कि यह बहुत अधिक सामान को अनदेखा करती है जिसे आप खोजना नहीं चाहते हैं। यह पर्ल में लिखा गया है और पर्ल के नियमित अभिव्यक्ति का उपयोग करता है (और इसलिए मैक और विंडोज पोर्ट भी हैं)।

http://betterthangrep.com/


Ack बहुत अच्छा है। लेकिन मुझे वास्तव में संदेह है कि यह grep की तुलना में कोई तेज़ है, क्योंकि यह एक ही तंत्र पर आधारित है।
पेल्टियर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.