2010-06-28 13 views
6

एक पाइपड इनपुटस्ट्रीम/पाइपडऑटपुटस्ट्रीम कनेक्शन बहुत अच्छा काम करता है जब डेटा को केवल एक आउटपुट में पाइप किया जाना चाहिए, लेकिन यदि एकाधिक आउटपुट स्ट्रीम एक इनपुट स्ट्रीम से जुड़े होते हैं, तो डेटा बन जाता है विभिन्न आउटपुट में खंडित। मेरे वर्तमान समाधान में एक थ्रेडेड "रीडर" होना शामिल है जो इनपुट इनपुट से डेटा पढ़ता है और फिर आउटपुटस्ट्रीम ऑब्जेक्ट्स को डेटा लिखता है जो पाठक से जुड़ा हुआ है। ऐसा लगता है कि यह ठीक काम करता है, लेकिन देशी PipedIO कक्षाओं की तुलना में यह गन्दा और अक्षम लगता है।एक इनपुट स्ट्रीम से एकाधिक आउटपुट स्ट्रीम तक डेटा पाइप करने का सबसे अच्छा तरीका

क्या इसे संभालने का कोई बेहतर तरीका है या यह कार्यान्वयन है कि मैं जितना अच्छा काम कर रहा हूं उतना अच्छा काम कर रहा हूं?

उत्तर

1

यदि एकाधिक इनपुट उपभोक्ताओं द्वारा एक इनपुट स्ट्रीम को पढ़ना है, और इनपुट स्ट्रीम क्षणिक है (यानी कोई संसाधन नहीं है जिसे 'रिवाउंड' किया जा सकता है, या एकाधिक इनपुट पॉइंटर्स का समर्थन करता है) तो आपको आमतौर पर एक बफरिंग योजना प्रदान करनी होगी यह व्यवहार करता है जैसे कि यह प्रत्येक डेटा आइटम को तब तक बरकरार रखता है जब तक सभी उपभोक्ताओं ने इसे पढ़ा न हो।

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

मुझे लगता है कि एकल इनपुट स्ट्रीम लगातार नहीं है (यानी डिस्क पर एक फ़ाइल) ... उस स्थिति में समाधान छोटा है।

+0

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

0

पुरानी शैली कोड, this will give you a good starting place

+0

प्रतिक्रिया के लिए धन्यवाद। क्या आपके पास कोई अतिरिक्त इनपुट है कि मेरे वर्तमान समाधान की तुलना में धागे में बात करने के दौरान यह कितना अच्छा काम करेगा? मैंने इनपुट डेटा को मल्टीप्लेक्स आउटपुट स्ट्रीम में पाइप करने के साथ खेलने की कोशिश की लेकिन प्रदर्शन कमजोर प्रतीत होता है और भरोसेमंद नहीं है। – WeeTodd

+0

@WeeTodd आपको शायद विभिन्न समाधानों को बेंचमार्क करने की आवश्यकता होगी। अगर आप perf मुद्दों में भाग लेते हैं तो मैं आगे बढ़ने की सिफारिश करता हूं और फिर विभिन्न विकल्पों को देखता हूं। इसे बनाओ ताकि आप आसानी से implemntations को प्रतिस्थापित कर सकें –

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