जबकि आप इसे पढ़ने के बाद डेटा का विश्लेषण करने के लिए दूसरे धागे का उपयोग कर सकते हैं, तो संभवतः आप ऐसा करके बड़ी मात्रा में नहीं जा रहे हैं। डेटा को पढ़ने के लिए एक से अधिक धागे का उपयोग करने की कोशिश करने से लगभग सुधारने की बजाय गति निश्चित रूप से चोट पहुंच जाएगी। डेटा को संसाधित करने के लिए एकाधिक धागे का उपयोग करना व्यर्थ है - प्रसंस्करण पढ़ने से कई गुना तेज होगा, इसलिए केवल एक अतिरिक्त थ्रेड के साथ, सीमा डिस्क की गति होगी।
महत्वपूर्ण गति प्राप्त करने के लिए एक (संभव) तरीका सामान्य iostreams को बाईपास करना है - जबकि कुछ सी फ़ाइल * के उपयोग के रूप में लगभग तेज़ हैं, मुझे कुछ भी पता नहीं है जो वास्तव में तेज़ है, और कुछ काफी हद तक हैं और धीमा। यदि आप इसे किसी सिस्टम (जैसे विंडोज) पर चला रहे हैं जिसमें आई/ओ मॉडल है जो सी से काफी अलग है, तो आप थोड़ी सी देखभाल के साथ काफी अधिक लाभ प्राप्त कर सकते हैं।
समस्या काफी सरल है: आपके द्वारा पढ़ी जा रही फ़ाइल (संभावित रूप से) आपके पास उपलब्ध कैश स्पेस से बड़ी है - लेकिन आपको कैशिंग से कुछ भी प्राप्त नहीं होगा, क्योंकि आप हिस्सों को दोबारा नहीं ले पाएंगे फ़ाइल फिर से (कम से कम अगर आप समझदारी से चीजें करते हैं)। इस प्रकार, आप किसी भी कैशिंग को बाईपास करने के लिए सिस्टम को बताना चाहते हैं, और बस डिस्क ड्राइव से जितनी संभव हो सके डेटा को अपनी मेमोरी में स्थानांतरित करें जहां आप इसे संसाधित कर सकते हैं। यूनिक्स जैसी प्रणाली में, शायद यह open()
और read()
(और आपको बहुत कुछ नहीं मिलेगा)। विंडोज़ पर, यह CreateFile
और ReadFile
है, FILE_FLAG_NO_BUFFERING
CreateFile
पर ध्वज गुजर रहा है - और यदि आप सही करते हैं तो यह शायद आपकी गति को लगभग दोगुना कर देगा।
आपको कुछ समानांतर संरचनाओं का उपयोग करके प्रसंस्करण करने की वकालत करने वाले कुछ उत्तरों भी मिल गए हैं। मुझे लगता है कि ये मौलिक रूप से गलत हैं। जब तक आप कुछ बेवकूफ नहीं करते हैं, तब तक फ़ाइल में शब्दों को गिनने का समय केवल फ़ाइल को पढ़ने के लिए कुछ मिलीसेकंड लंबा होगा।
जिस संरचना का मैं उपयोग करूंगा, उसके बारे में दो बफर होंगे, कहें, एक मेगाबाइट एक साथ। एक बफर में डेटा पढ़ें। उस बफर में शब्दों को गिनने के लिए उस बफर को अपने गिनती थ्रेड पर चालू करें। हालांकि यह हो रहा है, दूसरे बफर में डेटा पढ़ें। जब वे किए जाते हैं, मूल रूप से बफर स्वैप करते हैं और जारी रखते हैं। एक बफर से दूसरे तक सीमा पार करने वाले शब्द से निपटने के लिए आपको बफर को स्वैप करने में कुछ अतिरिक्त प्रोसेसिंग करने की आवश्यकता होगी, लेकिन यह बहुत छोटा है (मूल रूप से, यदि बफर सफेद से समाप्त नहीं होता है स्थान, आप अभी भी एक शब्द में हैं जब आप डेटा के अगले बफर पर परिचालन शुरू करते हैं)।
जब तक आप सुनिश्चित हों कि इसका उपयोग केवल बहु-प्रोसेसर (बहु-कोर) मशीन पर किया जाएगा, वास्तविक धागे का उपयोग ठीक है। यदि एक मौका है तो यह कभी भी एकल-कोर मशीन पर किया जा सकता है, तो आप इसके बजाय ओवरलैप किए गए I/O के साथ एक थ्रेड का उपयोग करके कुछ बेहतर हो जाएंगे।
क्या आप टेक्स्ट फ़ाइल की खोज कैसे की जाए, इस बारे में अधिक विशिष्ट हो सकते हैं? क्या फ़ाइल अपेक्षाकृत स्थैतिक है और आपको स्थैतिक फ़ाइल पर कई खोजों को चलाने की आवश्यकता है? क्या आपको कई अलग-अलग शब्दों की खोज करने की आवश्यकता होगी या क्या यह महत्वपूर्ण है कि एक शब्द की खोज जितनी जल्दी हो सके खत्म हो जाए? आमतौर पर उन शब्दों में एक पैटर्न होगा जो आप खोज रहे हैं - आईई। कुछ शब्द आपकी अधिकांश खोजों को बनाते हैं। – jthg
आप इसे एक बार में स्मृति में लोड करने से बचना चाहते हैं, आपकी स्थिति के लिए स्ट्रीम बनाए गए थे। –
फ़ाइल के विभिन्न हिस्सों को पढ़ने के लिए धागे का उपयोग करने का क्या उद्देश्य है? मान लें कि आपकी फाइल एक पारंपरिक हार्ड डिस्क पर है, सीधे फ़ाइल के माध्यम से स्ट्रीमिंग जाने का सबसे तेज़ तरीका है। यदि आपके पास एक ही समय में फ़ाइल के कई हिस्सों के लिए पूछे जाने वाले एकाधिक थ्रेड हैं, तो आपकी हार्ड डिस्क का सिर पूरे स्थान पर कूद जाएगा, जो बहु-थ्रेडिंग द्वारा प्राप्त किए गए किसी भी लाभ को ऑफ़सेट करने से अधिक होगा। – StriplingWarrior