2013-02-01 62 views
6

मैंने इस प्रश्न के उत्तर देखे हैं लेकिन मुझे पता नहीं लगा कि कौन से उत्तर सबसे तेज़ प्रदर्शन करेंगे। ये वे जवाब हैं जिन्हें मैंने देखा है - जो सबसे अच्छा है? एक समय मेंरूबी में एक बड़ी फाइल पढ़ने का सबसे तेज़ तरीका क्या है?

  1. पढ़ें एक पंक्ति प्रत्येक या each_line
  2. का उपयोग कर एक समय में एक लाइन पढ़ें का उपयोग कर readlines का उपयोग कर लाइनों की एक सरणी में
  3. यह सब बचाना हो जाता है और उसके बाद प्रत्येक
  4. उपयोग ग्रेप का उपयोग करें (सुनिश्चित नहीं है कि grep के साथ वास्तव में क्या करना है ...)
  5. sed का उपयोग करें (सुनिश्चित नहीं है कि वास्तव में क्या करना है ...)
  6. कुछ और?

साथ ही, क्या किसी अन्य भाषा का उपयोग करना बेहतर होगा या रूबी ठीक होनी चाहिए?

संपादित करें:

अधिक विवरण: प्रत्येक पंक्ति की तरह कुछ होता है "ID1 attr1_1 attr2_1 आईडी 2 attr1_2 attr2_2 ... IDN attr1_n attr2_n" (एन बहुत बड़ा है) और मैं एक डेटाबेस में उन डालना होगा। उस उदाहरण पंक्ति के लिए, मुझे डेटाबेस में एन पंक्तियों को सम्मिलित करने की आवश्यकता होगी।

+6

"बड़ी" फ़ाइल क्या है? आप इसके साथ क्या कर रहे हो क्या प्रदर्शन वास्तव में मायने रखता है? क्या आपने कुछ बेंचमार्क करने की कोशिश की है? –

+0

* कम से कम * 500,000 लाइनों और प्रति पंक्ति हजारों वर्णों पर। प्रत्येक पंक्ति के लिए मैं डेटाबेस के साथ कुछ करूँगा। प्रदर्शन मायने रखता है। मैंने कुछ भी बेंचमार्क नहीं किया है, लेकिन मैं जानना चाहता था कि क्या स्पष्ट उत्तर थे कि वे किस तरह काम करते हैं, इस पर आधारित बहुत तेज़ या धीमे थे। – user1136342

+0

फाइल स्थानीय है? – gmalette

उत्तर

4

रूबी पहले तीन विकल्पों के लिए डिस्क से वास्तविक पढ़ने के लिए समान या बहुत ही कम निम्न-स्तर कोड (सी में लिखा गया) का उपयोग करेगा, इसलिए उन्हें समान प्रदर्शन करना चाहिए। यह देखते हुए, आपको चुनना चाहिए कि जो भी आपके लिए सबसे सुविधाजनक है; ऐसा करने की क्षमता रूबी जैसी भाषाओं को इतनी उपयोगी बनाती है! आप डिस्क से डेटा के लॉट पढ़ रहे होंगे, इसलिए मैं each_line का उपयोग करने का सुझाव दूंगा और प्रत्येक पंक्ति को पढ़ते समय इसे संसाधित करता हूं।

मैं के रूप में वे अपने कोड कम पोर्टेबल बनाने के लिए और विफलताओं कि मुश्किल हो सकता है के लिए आप सामने आ जाएगी चित्र में grep, sed, या किसी अन्य तरह के बाहरी उपयोगिताओं लाने की सिफारिश नहीं होगा जब तक आप एक बहुत अच्छा कारण है, का निदान करें।

2

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

यदि कोई विशेष रीड लार्जफाइलफ़ास्ट विधि आवश्यक है तो यह होना चाहिए क्योंकि यह वास्तव में किसी भी तरह प्रोग्राम को बाधित कर रहा है। अब, आप इसे करने के लिए एक सी प्रोग्राम लिखते हैं और popen इसे अपने रूबी कोड के भीतर एक अलग प्रक्रिया के रूप में लिखते हैं। आप इसे read_large.c पर कॉल कर सकते हैं और (शायद) यह कहने के लिए कमांड लाइन तर्क का उपयोग करें कि व्यवहार कैसे करें।

यह इस विचार को चैंपियन कर रहा है कि तेजी से चलने के बजाए एक तेजी से विकास के लिए एक स्क्रिप्टिंग भाषा का उपयोग किया जाता है। चूंकि इस तरह के डेवलपर रूबी जैसे कुछ प्रोग्राम में तेजी से 'प्रोटोटाइप' द्वारा बहुत उत्पादक हो सकते हैं और बाद में घटकों को फिर से लिखने के लिए कुछ निम्न स्तर कोड वारंट कर सकते हैं। अक्सर, हालांकि, यह स्क्रिप्ट में काम करने के बाद, कुछ भी करने के लिए जरूरी नहीं है।

Ruby Docs एक अलग प्रक्रिया लॉन्च करने और फ़ाइल के रूप में इसका इलाज करने का वर्णन करता है। यह आसान-चंचल है! एक अच्छी शुरुआत program modularity पर लिनक्स प्रोग्रामिंग के प्रारंभिक अनुच्छेद की कला है। यह पुस्तक लिनक्स के मानक स्ट्रीम संपादक का उपयोग करने का एक शानदार उदाहरण भी बनाती है, जिसे sed कहा जाता है, जिसे आप शायद रूबी से अभी उपयोग कर सकते हैं।

यदि आपको बहुत सारे पाठ को पार्स या संपादित करने की आवश्यकता है तो कई दुभाषियों या संपादकों को sed की कार्यक्षमता के आसपास लिखा गया है। इसके अलावा, यदि आप ब्रूस बार्नेट द्वारा Introduction to SED पर अच्छा नहीं है तो यह आपको कुछ सुपर कुशल लिखने के बहुत सारे प्रयासों को बचा सकता है।