2012-11-29 16 views
5

मैं कुछ जावा कोड पर काम कर रहा हूं जिसका अंततः कुछ वास्तविक फ़ाइलों (20 जीबी के तहत 1 जीबी से अधिक) तक पहुंचने के लिए ऐप सर्वर के भीतर उपयोग किया जाएगा, संभवतः एनएफएस पर होस्ट किया गया शेयर।java.io.RandomAccessFile स्केलेबिलिटी (या अन्य विकल्प)

  1. बड़ी फाइल मुझे लगता है कि फ़ाइल
  2. पढ़ें कि फ़ाइल (आमतौर पर 1 एमबी से कम)
  3. से बाइट्स में एक यादृच्छिक बात करने के लिए
  4. नेविगेट पढ़ने की जरूरत खोजें: एक व्यक्ति अनुरोध सर्विसिंग यह कर शामिल होगी उन बाइट्स

लौटें मैं पल कि बस एक नया केवल पढ़ने के लिए फ़ाइल को खोलता है और यह बंद कर देता है पर कुछ खुश सरल POC कोड है:

RandomAccessFile raf=new RandomAccessFile(myFileName, "r"); 
try{ 
    byte[] buffer = new byte[size]; 
    raf.seek(position); 
    raf.reafFully(buffer); 
    return buffer; 
} 
finally{ 
    raf.close(); 
} 

मुझे आश्चर्य है कि यह एक सुंदर सरल दृष्टिकोण है जो वास्तव में अच्छा काम करना चाहिए, या मूर्खतापूर्ण सरल दृष्टिकोण जिसमें भारी भार के तहत बहुत सी समस्याएं होंगी (और शायद मुझे थ्रेड-सुरक्षित पूल बनाना होगा पाठकों, आदि)। स्पष्ट रूप से उस धारणा का परीक्षण करना सबसे अच्छा होगा, लेकिन मैं सोच रहा था कि क्या किसी भी दृष्टिकोण के साथ कोई सर्वोत्तम प्रथा या ज्ञात समस्याएं थीं। अब तक मैं बहुत ज्यादा googling पता लगाने में सक्षम नहीं है ...

धन्यवाद!

पीएस। यह अभी तक स्पष्ट नहीं है कि इसका अंतिम संस्करण विंडोज या * निक्स पर होस्ट किया जाएगा या नहीं। यह भी स्पष्ट नहीं है कि बड़ी फ़ाइलों को कैसे साझा किया जाएगा। पीपीएस। ऐप सर्वर को क्लस्टर में कॉन्फ़िगर करने की संभावना है, इसलिए दो अलग-अलग ऐप सर्वरों को एक ही समय में एक ही बड़ी साझा फ़ाइल को पढ़ने की आवश्यकता हो सकती है।

+1

मुझे ठीक लग रहा है। जब तक आप स्थानीय डिस्क पर या स्मृति – irreputable

+0

में फ़ाइल को कैश नहीं करते हैं, तब तक आप इससे तेज नहीं हो सकते हैं, इसलिए फ़ाइल हैंडल खोलने और रिलीज़ करने की लागत नगण्य है? यहां तक ​​कि, एनएफएस शेयर कहें? – Dave

+0

शायद स्थानीय फाइलों पर भी नगण्य नहीं है। यदि यह चिंता का विषय है, तो आप हैंडल का पूल रख सकते हैं। या, 1 'FileChannel' खोलें, इसे पढ़ने के लिए समवर्ती रूप से पढ़ें (डीएसटी, स्थिति) ' – irreputable

उत्तर

2

एक और विकल्प जावा एनआईओ, अर्थात् फाइलचैनल है। FileChannel भी पर नेविगेट करने योग्य है और यह RandomAccessFile से तेज़ हो सकता है क्योंकि यह तथाकथित प्रत्यक्ष बफर के साथ काम कर सकता है। इसमें कुछ और दिलचस्प विशेषताएं हैं, उदाहरण के लिए यह अंतःस्थापित है।

+0

अच्छी कॉल। हाँ, मैंने उन लोगों के साथ परीक्षण किया है। ऐसा प्रतीत होता है कि यह लापरवाह रूप से तेज़ है, लेकिन यह * विशेष * उपयोग * में जटिलता की जरुरत के लिए पर्याप्त तेज़ नहीं है। मैं वास्तव में किसी अन्य ऐप पर जेवीएम में एक भौतिक विंडोज मेमोरी रिसाव के कारण एनओओ द्वारा जला दिया गया था, इसलिए मैं तब से इसका उपयोग करने में थोड़ा संकोच कर रहा हूं। ईमानदारी से, यदि रैंडम एक्सेस दृष्टिकोण भार के तहत प्रदर्शन करता है और साथ ही यह एकल थ्रेडेड परीक्षणों पर करता है, तो यह मेरे लिए सही है। – Dave

+0

दाएं, अभी भी जांचें अगर अभी तक नहीं है http://stackoverflow.com/questions/1605332/java-nio-filechannel-versus-fileoutputstream-performance-usefulness –

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