2010-05-21 9 views
7

मेरे पास कोड का एक टुकड़ा है जो लूप में स्थानीय फाइल सिस्टम से अपेक्षाकृत छोटी फ़ाइलों (केबी के जोड़े) के नरक (सैकड़ों हजार) को नरक पढ़ता है। प्रत्येक फ़ाइल के लिए सामग्री पढ़ने के लिए बनाया गया java.io.FileInputStream है। प्रक्रिया बहुत धीमी है और उम्र लेती है।FileInputStream को बफर करने के बारे में क्या?

क्या आपको लगता है कि एफआईएस को java.io.BufferedInputStream में लपेटना महत्वपूर्ण अंतर देगा?

+4

क्यों खुद को अंतर का प्रयास नहीं करें? यह जानने का एकमात्र तरीका है कि यह आपके पर्यावरण में कैसे काम करता है, आपके जेवीएम इत्यादि के साथ –

+1

मैंने वास्तव में इसे अपने पर्यावरण पर मापा है। बीआईएस में एफआईएस लपेटते समय कोई बड़ा सुधार नहीं होता है। –

उत्तर

9

आप पहले से ही पढ़ें/लिखें लूप (BufferedInputStream के नवीनतम कार्यान्वयन का उपयोग करता 8KB) में एक सभ्य आकार का एक byte[] buffer उपयोग नहीं कर रहे हैं, तो यह होगा निश्चित रूप से मेकअप अंतर। इसे अपने आप आज़माएं। OutputStream को BufferedOutputStream भी बनाना न भूलें।

लेकिन अगर आपने इसे पहले से ही byte[] का उपयोग करके buffered किया है और/या यह सब कुछ केवल थोड़ा अंतर बनाता है, तो आपने हार्डडिस्क और I/O नियंत्रक की गति को बाधा के रूप में मारा है।

3

मुझे बहुत संदेह है कि इससे कोई फर्क पड़ता है या नहीं।

आपकी मौलिक समस्या छोटी फाइलों के सैकड़ों throusands है। उनको पढ़ना डिस्क को फेंकने और हमेशा के लिए ले जा रहा है, इससे कोई फर्क नहीं पड़ता कि आप इसे कैसे करते हैं, आप हार्डडिस्क के अंदर यांत्रिक आंदोलन पर 99.9% खर्च करेंगे।

वहाँ दो इसे ठीक करने के तरीके हैं:

  • एक SSD पर अपने डेटा को बचाने - वे विलंबता (परिमाण कम से पांच के आदेश के रूप में) बहुत कम है।
  • कुछ बड़ी फ़ाइलों में अपने डेटा को पुनर्व्यवस्थित करें और उन क्रमिक रूप से
3

है कि आप डेटा पढ़ रहे हैं कि कैसे पर निर्भर करता है पढ़ें। यदि आप FileInputStream से बहुत अक्षम तरीके से पढ़ रहे हैं (उदाहरण के लिए, बाइट-बाय-बाइट को कॉल करना), तो BufferedInputStream का उपयोग करके नाटकीय रूप से चीजों में सुधार हो सकता है। लेकिन यदि आप पहले से ही FileInputStream के साथ एक उचित आकार के बफर का उपयोग कर रहे हैं, तो BufferedInputStream पर स्विच करना कोई फर्क नहीं पड़ता।

चूंकि आप बड़ी संख्या में बहुत छोटी फाइलों की बात कर रहे हैं, इसलिए एक बड़ी संभावना है कि बहुत सारी देरी निर्देशिका संचालन (खुली, बंद) के कारण होती है, न कि फाइलों से बाइट्स की वास्तविक पढ़ाई।

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