मैं वर्तमान में JOGL (जावा ओपनजीएल बाइंडिंग) का उपयोग कर 3 डी ग्राफिक्स एप्लिकेशन विकसित कर रहा हूं। संक्षेप में, मेरे पास एक विशाल परिदृश्य बाइनरी फ़ाइल है। इसके आकार के कारण, मुझे रन-टाइम में इलाके के टुकड़ों को स्ट्रीम करना होगा। इसलिए, हम स्पष्ट रूप से यादृच्छिक पहुंच चिंता देखते हैं। मैं पहले से ही पहली (और गंदा :)) कार्यान्वयन समाप्त कर दिया है (शायद यह है मल्टी-थ्रेडेड), जहां मैं एक मूर्ख दृष्टिकोण का उपयोग कर रहा है ... यहाँ यह आरंभीकरण है:जावा में फ़ाइल स्ट्रीमिंग
dataInputStream = new DataInputStream(new BufferedInputStream(fileInputStream,4 * 1024);
dataInputStream.mark(dataInputStream.available());
और जब मैं
dataInputStream.reset();
dataInputStream.skipBytes(offset);
dataInputStream.read(whatever I need...);
जब से मैं छोटा सा अनुभव है कि पहले था: (धारा) विशेष हिस्सा (मैं पहले से ही पता है अपने "ऑफसेट" फ़ाइल में) मैं निम्नलिखित प्रदर्शन कर रहा हूँ (मुझ पर शर्म की बात है :)) पढ़ने की जरूरत है चीज मैं सोच सकता था :) तो, अब तक मैंने 3 उपयोगी और काफी रोचक लेख पढ़े हैं (मैं आपको उन्हें पढ़ने के लिए सुझाव दे रहा हूं, शायद यदि आप इस विषय में रुचि रखते हैं)
Byte Buffers and Non-Heap Memory - श्री ग्रेगरी जावा NIO में साक्षर हो रहा है।
जावा टिप: कैसे फ़ाइलों को पढ़ने में जल्दी से [http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly] - यही कारण है कि एक दिलचस्प बेंचमार्क है।
आलेख: ट्यूनिंग जावा आई/ओ प्रदर्शन [http://java.sun.com/developer/technicalArticles/Programming/PerfTuning/] - सरल सूर्य सिफारिशों, लेकिन नीचे स्क्रॉल करें और पर एक नजर है कृपया " रैंडम एक्सेस "अनुभाग वहां; वे स्वयं-बफरिंग सुधार के साथ RandomAccessFile (RAF) का एक सरल कार्यान्वयन दिखाते हैं।
श्री ग्रेगरी अपने लेख के अंत में कई * .java फाइलें प्रदान करता है। उनमें से एक फाइलचैनेल + बाइटबफर + मैपिंग (एफबीएम) और आरएएफ के बीच बेंचमार्किंग है। उनका कहना है कि उन्होंने आरएएफ की तुलना में एफबीएम का उपयोग करते समय 4x गतिरोध देखा। (, फ़ाइल दायरे में ई जी 0 - file.length()।।)
- ऑफसेट बेतरतीब ढंग से उत्पन्न होता है;: मैं निम्न स्थितियों में इस बेंचमार्क भाग गया है (ई जी पहुँच के स्थान पर।।)
- फ़ाइल का आकार 220 एमबी है;
- 1 000 000 पहुंच (75% पढ़ता है और 25% राईट)
परिणाम आश्चर्यजनक थे: आरएएफ के लिए
~ 28 सेकंड! ~ एफबीएम के लिए 0.2 सेकंड!
हालांकि, इस बेंचमार्क में आरएएफ के बारे में उनकी कार्यान्वयन स्वयं बफरिंग (3 लेख के बारे में एक कहता है) नहीं है, तो मैं इसे "RandomAccessFile.seek" विधि फोन, जो प्रदर्शन चला जाता है बहुत मुश्किल है लगता है।
ठीक है, अब उन सभी चीजें मैं वहाँ 1 प्रश्न और 1 दुविधा :)
प्रश्न है सीखा है के बाद: हम का उपयोग कर "FileChannel.map" जावा कॉपी करता है पूरी फ़ाइल एक फ़ाइल मानचित्रण कर रहे हैं MappedByteBuffer में सामग्री? या यह सिर्फ इसे अनुकरण करता है?यदि यह प्रतिलिपि बनाता है, तो एफबीएम दृष्टिकोण का उपयोग मेरी स्थिति के लिए उपयुक्त नहीं है, है ना?
दुविधा: प्रश्न पर अपने जवाब पर निर्भर करता है ...
मानचित्रण प्रतियां एक फ़ाइल है, तो ऐसा लगता है जैसे मैं जाने के लिए केवल 2 संभव समाधान है: आरएएफ + आत्म बफरिंग (तीसरे आलेख में से एक) या फ़ाइलChannel (मैपिंग के साथ नहीं) में स्थिति का उपयोग करें ... कौन सा बेहतर होगा?
यदि मानचित्रण फ़ाइल की प्रतिलिपि नहीं करता है, तो मेरे पास 3 विकल्प हैं: दो पिछले और एफबीएम स्वयं।
संपादित: यहाँ एक और सवाल है। आप में से कुछ यहां कहते हैं कि मैपिंग फ़ाइल को मैप्डबेट बफर में कॉपी नहीं करता है। ठीक है तो, मैं क्यों 1GB फ़ाइल तो मैप कर सकते हैं नहीं, मैं हो रही है संदेश "को नहीं ढूंढ़ सकी" ...
पुनश्च मैं सलाह के साथ एक पूरा जवाब प्राप्त करना चाहते हैं, के बाद से मैं नहीं पा रहा हूँ इंटरनेट पर इस विषय पर लगातार जानकारी खोजने के लिए।
धन्यवाद :)
यदि आप कहते हैं कि मैप्डबेट बफर एचडी के लिए एक सूचक है, तो यह बेंचमार्किंग में इतने अच्छे नतीजे कैसे पहुंचता है? आईओ में एकमात्र संभावित स्पीडअप सुविधा जिसे मैं व्यक्तिगत रूप से जानता हूं, कम से कम डिस्क तक पहुंचने के लिए है और यहां एकमात्र समाधान बफरिंग है। फिर, यदि आप इस चिंता पर पर्याप्त साक्षर हैं, तो कृपया अधिक विस्तृत जानकारी प्राप्त करें। –
@ हरोगोगन मैं उस लेख से उद्धरण देता हूं: "अंतर लगभग पूरी तरह से कर्नेल संदर्भ स्विच के कारण है" – someguy
आपको जवाडोक का जिक्र करके आपको मजाक करना होगा, है ना? Coz, मैं कोई विशेष जानकारी नहीं मांग रहा हूँ। मुझे अभी भी संभावित समाधानों पर कोई प्रत्यक्ष उत्तर या उचित विचार और टिप्पणियां नहीं मिली हैं। –