2010-12-14 11 views
5

मैं अपने कोड को प्रोफाइल कर रहा था जो एक बाइनरी फ़ाइल लोड कर रहा था। लोड समय लगभग 15 सेकंड था।जावा में BufferedInputStream के लिए इष्टतम आकार की तलाश

मेरा अधिकांश लोड समय बाइनरी डेटा लोड करने वाले तरीकों से आ रहा था।

मैं अपने DataInputStream बनाने के लिए निम्नलिखित कोड था:

is = new DataInputStream(
    new GZIPInputStream(
    new FileInputStream("file.bin"))); 

और मैं यह करने के लिए इसे बदल: के बाद मैं इस छोटा सा संशोधन कोड डालने के लिए 15 सेकंड से चला गया किया

is = new DataInputStream(
    new BufferedInputStream(
    new GZIPInputStream(
    new FileInputStream("file.bin")))); 

तो 4.

लेकिन फिर मैंने पाया कि BufferedInputStream में दो रचनाकार हैं। अन्य कन्स्ट्रक्टर आपको बफर आकार को स्पष्ट रूप से परिभाषित करने देता है।

मैं दो प्रश्न हैं:

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

उत्तर

8

दोनों GZIPInputStream और BufferedInputStream दोनों आंतरिक बफर का उपयोग करते हैं। यही कारण है कि GZIPInputStream के अंदर BufferedInputStream का उपयोग करना कोई लाभ नहीं प्रदान करता है। GZIPInputStream के साथ समस्या यह है कि यह उत्पन्न होने वाले आउटपुट को बफर नहीं करता है, इस प्रकार आपका वर्तमान संस्करण बहुत तेज़ है।

BufferedInputStream के लिए डिफ़ॉल्ट buffersize 8kb है, तो आप यह देखने के लिए कोशिश कर सकते हैं कि यह मदद करता है या बढ़ा सकता है या घटा सकता है। मुझे संदेह है कि सटीक संख्या बहुत मायने रखती है, ताकि आप आसानी से दो से गुणा या विभाजित कर सकें।

यदि फ़ाइल छोटी है, तो आप इसे पूरी तरह से बफर करने का भी प्रयास कर सकते हैं। यह आपको सिद्धांत में सबसे अच्छा प्रदर्शन देना चाहिए। आप GZIPInputStream (डिफ़ॉल्ट 512 बाइट्स) के बफर आकार को बढ़ाने का भी प्रयास कर सकते हैं, क्योंकि इससे डिस्क से पढ़ने में तेजी हो सकती है।

+0

मेरा सुझाव है कि डिस्क से पढ़ने पर आप GZIPInputStream के लिए 64K का बफर आज़माएं। मैं 1 एमबी का उपयोग करता हूं, जो आवश्यक से अधिक होने की संभावना है। ;) –

4
  1. एक कोडित द्विआधारी खोज के साथ परेशान न हों। बस कुछ मूल्यों को हाथ से आज़माएं और समय की तुलना करें (यदि आप चाहें तो मैन्युअल बाइनरी खोज कर सकते हैं)। आपको सबसे अधिक संभावना है कि बफर आकारों की एक विस्तृत श्रृंखला आपको निकटतम प्रदर्शन प्रदान करेगी, इसलिए चाल का सबसे छोटा चयन करें।

  2. क्या आप सही क्रम है: (। लेकिन उत्पादन)

    is = new DataInputStream(
        new BufferedInputStream(
        new GZIPInputStream(
        new FileInputStream("file.bin")))); 
    

    GZIPInputStream अंदर एक BufferedInputStream डालने में थोड़ा बिंदु है के बाद से बाद के पहले से ही अपने इनपुट बफ़र्स

    निकाला जा रहा है GZIPInputStream एक जीत हो सकती है, लेकिन डेटा को डिस्क से पढ़ना पड़ता है और फाइल सिस्टम कैश में निवासी नहीं है, लेकिन प्रदर्शन के लिए सबसे अधिक हानिकारक होगा। कारण यह है कि डिस्क से पढ़ने बहुत धीमी है और gzip डिकंप्रेसिंग बहुत तेज है। इसलिए यह डिस्क से कम डेटा पढ़ने के लिए आम तौर पर सस्ता है और डिस्क से अधिक डेटा पढ़ने के लिए स्मृति में इसे डिकंप्रेस करता है।

+0

आपकी अंतर्दृष्टि के लिए धन्यवाद। – Brad

+0

आपका स्वागत है। मैंने थोड़ा और जानकारी के साथ जवाब संपादित किया है। – NPE

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