2011-10-10 21 views
5

क्या एक फ़ाइल में एक फ़ाइल में एक समय रेखा पढ़ने के दौरान एक समय में एक अंतरनीय अंतर (सिद्धांत में) है?पूर्ण फ़ाइल को पढ़ने के द्वारा लाइन फ़ाइल द्वारा फ़ाइल लाइन पढ़ने पर प्रदर्शन

पूरी फ़ाइल पढ़ना इस्तेमाल किया स्मृति की मात्रा पर एक नकारात्मक प्रभाव है, लेकिन यह तेजी से काम करता है?

मुझे एक फ़ाइल पढ़ने और प्रत्येक पंक्ति को संसाधित करने की आवश्यकता है। मुझे नहीं पता कि मुझे एक समय में एक पंक्ति पढ़नी चाहिए और इसे संसाधित करना चाहिए, या पूरी फाइल को पढ़ना चाहिए, सभी को संसाधित करें, फिर आउटपुट पर लिखें।

मैं पहले से ही सेटअप prgm लाइन द्वारा लाइन को पढ़ने के लिए है और मुझे पता है कि क्या यह पूरी फ़ाइल को पढ़ने के लिए इसे बदलने के लिए प्रयास (आसान मेरी सेटअप नहीं दिया) के लायक है चाहता हूँ।

धन्यवाद,

+1

सिद्धांत रूप में, ड्राइव संभावित तलाश और बाकी क्या हो रहा है के आधार पर एक पंक्ति-दर-पंक्ति कार्यक्रम में अधिक बार पढ़ा है, करना होगा। व्यावहारिक रूप से, यह कोई मुद्दा नहीं हो सकता है क्योंकि buffered फ़ाइल i/o शायद बड़े ब्लॉक में पढ़ने के लिए उपयोग किया जा रहा है। आपका माइलेज आपके हार्डवेयर और आपके एल्गोरिदम के विवरण के आधार पर अलग-अलग होगा। ऑप्टिमाइज़ करते समय, आपको अपने प्रोग्राम के एकाधिक पुनरावृत्तियों को लिखने की उम्मीद करनी होगी, और टाइमर कोड जोड़ें या सबसे अधिक समय ले रहा है यह जानने के लिए एक प्रोफाइलर का उपयोग करें। – holtavolt

उत्तर

0

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

+0

किसी भी आधुनिक * निक्स, या विंडोज ऑपरेटिंग सिस्टम में इस तरह की चीजें (बफरिंग, प्रक्रियाओं के बीच साझा करना, अद्यतनों को चिह्नित करना) ऑपरेटिंग सिस्टम द्वारा आपके लिए किया जाता है। –

+0

मैं सहमत हूं .... कभी-कभी जब लोग दक्षता बहुत गंभीर लेते हैं तो वे वास्तव में इसे और भी खराब बनाते हैं! यह बफरिंग को कार्यान्वित/हस्तक्षेप करके, प्रक्रियाओं के बीच साझा करना, अद्यतनों को चिह्नित करना है। –

0

स्मृति में पूरी फ़ाइल पढ़ना आम तौर पर एक अच्छा विचार है क्योंकि फ़ाइलें विशाल हो सकता है और स्मृति का एक बहुत और स्मृति से बाहर चलाने के सबसे खराब स्थिति में समय लग सकता है नहीं है। इसलिए, प्रदर्शन और स्मृति उपयोग को संतुलित करने के लिए, आप बफर के माध्यम से फ़ाइल के एक ब्लॉक को बफर में पार्स और पार्स में पढ़ते हैं। जब आप ब्लॉक को संसाधित करते हैं, तो ईओएफ तक अगला ब्लॉक पढ़ें।

एक अच्छा ब्लॉक आकार पर निर्णय लेना आप क्या हासिल करना चाहते के आधार पर किया जाना होगा।

+1

फाइल सिस्टम आपके लिए यह "ब्लॉक" आईएनजी करेगा! इसे बुफर प्रबंधन कहा जाता है, ओएस बफरिंग के शीर्ष पर अपने स्वयं के बफरिंग को लागू करने से आपको केवल धीमा कर दिया जाएगा। –

+0

@ जेम्स एंडरसन - आप सही हैं :) मैंने इसे ओपी के रूप में विशेष रूप से "सिद्धांत में" बताया है। – srikanta

2

पूरी फ़ाइल पढ़ना थोड़ा तेज होगा - लेकिन ज्यादा नहीं!

लेकिन सावधानी बरतें क्योंकि पूरी फ़ाइल को स्केलेबल नहीं है क्योंकि आप सिस्टम में उपलब्ध स्मृति से सीमित हैं, एक बार जब फ़ाइल आकार आपके प्रोग्राम में रैम avaibale के आकार से अधिक हो जाता है तो यह स्वैप स्पेस का उपयोग शुरू कर देगा। यदि फ़ाइल का आकार वर्चुअल मेमोरी के आकार से अधिक है तो आपका प्रोग्राम क्रैश हो जाएगा।

0

एक कारक आप कितना डेटा पढ़ने होने जा रहे हैं, और इसलिए कितनी देर तक कार्यक्रम शुरू में चलाने के लिए ले जाता है, प्रदर्शन पर काम कर में किसी भी लाभ है अर्थात है कि क्या वहाँ है।

सॉफ्टवेयर प्रदर्शन के बारे में सोच पर कुछ अच्छा है, सामान्य सलाह के लिए this answer में पुस्तक कोट देखें।

(मुझे पता है तुम सिद्धांत में एक जवाब के लिए कर रहे हैं, लेकिन जब प्रदर्शन के बारे में चिंता के इस पहलू भी महत्वपूर्ण है, जब भी आप समय की एक निश्चित राशि खर्च करने के लिए है।)

1
अन्य लोगों की तरह

, मेरा मानना ​​है कि बड़े पढ़ने से आपके आवेदन के प्रदर्शन में कुछ सुधार होगा, लेकिन चमत्कार की उम्मीद नहीं है, I/O पहले से ही ओएस परत पर buffered है, तो आप केवल बहुत सी पढ़ी कॉल के ओवरहेड को कम करके प्राप्त कर रहे हैं। एक ही बार में पूरी फाइल को पढ़ना खतरनाक है, जब तक कि आप अपनी इनपुट फ़ाइलों के लिए अधिकतम संभव आकार नहीं जानते। फ़ाइल को बड़े ब्लॉक में पढ़ने का सबसे उचित तरीका है।

यदि आप और भी सुधार करना चाहते हैं, तो आपको प्रसंस्करण के साथ I/O ओवरलैप करने पर विचार करना चाहिए। मान लीजिए कि आप 128 एमबी के ब्लॉक में इनपुट फ़ाइल पढ़ते हैं। अपने मुख्य धागे पर आप पहले 128 एमबी ब्लॉक को पढ़ते हैं और फिर प्रोसेसिंग के लिए इसे वर्कर थ्रेड पर भेज देते हैं। जबकि कार्यकर्ता थ्रेड काम करने के लिए मुख्य धागा दूसरे 128 एमबी ब्लॉक पढ़ता है। उस बिंदु से, जबकि कार्यकर्ता थ्रेड ब्लॉक एन को संसाधित कर रहा है, मुख्य धागा डिस्क से ब्लॉक एन + 1 पढ़ रहा है।

0

मुझे लगता है कि यह आपके आवेदन की ज़रूरतों पर निर्भर करेगा (जैसे अधिकांश चीजें, मुझे पता है)। नोड जेएस में 1 एमबी फ़ाइल पढ़ना ~ 3-4x तेज है fs.readFile() के साथ एक पठनीय स्ट्रीम या लाइन रीडर का उपयोग करने के लिए जहां तक ​​केवल फ़ाइल पढ़ना जाता है। यदि फ़ाइल बहुत बड़ी है और आप फ्लाई पर इनपुट प्रोसेस कर रहे हैं तो स्ट्रीम कुछ अतिरिक्त प्रदर्शन प्रदान कर सकते हैं। यह आदर्श भी हो सकता है यदि आपका एप्लिकेशन पहले से ही बहुत मेमोरी का उपभोग कर रहा है क्योंकि नोड प्रक्रिया में 64 बिट सिस्टम पर ~ 1.5 जीबी मेमोरी सीमा है। प्रसंस्करण भाग जैसे ही वे आते हैं, उतना अधिक प्रदर्शनशील हो सकता है यदि डेटा का स्रोत धीमा है, सीपीयू इसे कितनी तेज़ी से संसाधित कर सकता है (एचडीडी या टेप पर संग्रह, टीसीपी जैसे नेटवर्क कनेक्शन)। मेमोरी बनाम इसे एक मेमोरी बनाम स्ट्रीम में पढ़ने के लिए, मैं डेटा घटनाओं को उत्सर्जित करने के लिए फ़ंक्शन कॉल ओवरहेड का अनुमान लगा रहा हूं और प्रोसेसिंग फ़ंक्शन कॉलबैक पर स्विचिंग प्रक्रिया को धीमा कर रहा हूं।

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