2010-11-04 17 views
8

मैं मैप किए गएबेट बफर का उपयोग फ़ाइल पढ़ने/लिखने के संचालन() को तेज़ करने के लिए कर रहा हूं। मेरे प्रश्न नीचे दिए गए हैं:क्या हमें डिस्क पर डेटा फ्लश करने के लिए मैप्डबेट Buffer.force() का उपयोग करने की आवश्यकता है?

  1. मुझे यकीन नहीं है कि मुझे डिस्क पर सामग्री को फ्लश करने के लिए .force() विधि का उपयोग करने की आवश्यकता है या नहीं। ऐसा लगता है .force(), .getInt() अभी भी पूरी तरह से काम कर सकता है (ठीक है, क्योंकि यह एक मेमोरी-मैप किए गए बफर है, मुझे लगता है .getInt() डिस्क से डेटा प्राप्त करता है, जिसका अर्थ है कि डेटा को फ़्लश कर दिया गया है डिस्क पहले से ही।

  2. .force() विधि एक अवरुद्ध विधि है एक अवरुद्ध विधि एक तुल्यकालन ब्लॉक है?

  3. ?

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

  5. अगर हमें कॉल करने की आवश्यकता है .force(), इसे किसी अन्य धागे से कॉल करने से प्रदर्शन में सुधार करने में मदद मिलेगी? क्या यह सिंक्रनाइज़ेशन समस्या के कारण डेटा दूषित करेगा?

    आयात java.io.FileNotFoundException; आयात java.io.IOException; आयात java.io.RandomAccessFile; आयात java.nio.MappedByteBuffer आयात; आयात java.nio.channels.FileChannel; आयात java.nio.channels.FileChannel.MapMode;

सार्वजनिक वर्ग मुख्य {

public static void main(String[] args) throws IOException { 
    System.out.println("start"); 

    RandomAccessFile raf = new RandomAccessFile("test.map", "rw"); 
    FileChannel fc = raf.getChannel(); 
    MappedByteBuffer mbb = fc.map(MapMode.READ_WRITE, 0, 2000000); 

    int total = 0; 
    long startTime = System.currentTimeMillis(); 
    for (int i = 0; i < 2000000; i += 4) { 
     mbb.putInt(i, i); 
     //mbb.force(); 
     total += mbb.getInt(i); 
    } 
    long stopTime = System.currentTimeMillis(); 

    System.out.println(total); 
    System.out.println(stopTime - startTime); 
    System.out.println("stop"); 
} 

}

+0

जेडीके का संस्करण? (यह नहीं कि यह वास्तव में बहुत बदल गया है) –

+0

मुझे नहीं लगता कि इससे क्या अंतर आएगा। – EJP

+0

जावाडोक को देखने के बाद कोई नहीं :-) –

उत्तर

3
  1. आप केवल यदि आप चरम व्यवहार आवश्यकताओं है यह फोन करना चाहिए अर्थात आप एक डेटाबेस को लागू कर रहे हैं। getInt() स्मृति से पढ़ता है: ऑपरेटिंग सिस्टम फ़ाइल को उस स्मृति में और बाहर पृष्ठ देता है।

  2. यह निर्दिष्ट नहीं है।

  3. यदि निर्दिष्ट हो तो तरीके सिंक्रनाइज़ किए जाते हैं। इसका कोई संबंध नहीं है कि वे ब्लॉक करें या नहीं।

  4. देखें (1)। डेटा अभी भी लिखा जाएगा लेकिन ऑपरेटिंग सिस्टम की बजाय आपकी इच्छा के अनुसार।

  5. मुझे शक है, लेकिन देखें (2), और मुझे संदेह है कि आपको इसे बिल्कुल कॉल करने की आवश्यकता है, देखें (1)।

+0

गाह, आपका जवाब पहले में आना चाहिए था, बहुत कुछ कहने के लिए क्षमा चाहते हैं :)। –

+0

मेरे पास एक सवाल है, अगर मैं बल नहीं कहता(), क्या उस फ़ाइल के लिए कोई आईओ ऑपरेशन है जब मैं putInt या getInt कहता हूं? – Jaskey

2

ठीक है, एक अलग नज़रिए के साथ मेरा उत्तर ले (मैं एक NIO विशेषज्ञ नहीं हूँ)

1.) putInt(i, i) MappedByteBuffer (MBB) जो स्मृति और ऑपरेटिंग में है करने के लिए लिखेंगे जब सिस्टम चाहता है तो वास्तविक अंतर्निहित फ़ाइल (test.map) में उस मान को स्थानांतरित करता है।

force() का उपयोग कर ऑपरेटिंग सिस्टम को डेटा 'अब' स्थानांतरित करने के लिए कहता है (जो उपयोगी हो सकता है यदि आपके पास एक और प्रक्रिया है जिसे उस फ़ाइल से पढ़ने की आवश्यकता है)।

आपका getInt(i) MappedByteBuffer (MBB) से मूल्य पढ़ रही है, यदि आप जिस तरह से है कि आप तो कर रहे हैं आप जानते हैं कि हुड के नीचे अपनी फ़ाइल) है कि स्मृति बफर साथ सिंक में है में force() का उपयोग करें।

संभावना के रूप में जावा 7 NIO.2 सामान बात की इस तरह करने में सक्षम किया जा रहा है का उल्लेख करने के लिए शुरू होता आप सुनिश्चित नहीं हैं कि force()

2. उपयोग करने के लिए) की जरूरत नहीं है, मुझे लगता है कि यह है एक गैर-अवरुद्ध तरीके से। मैं अभी भी उस समय शोध कर रहा हूं।

3.) ये दो अलग-अलग चिंताएं हैं। मैं डौग ली की किताब :-) पर एक नज़र रखने की सलाह दूंगा।

4.) जैसा कि 1.) कहता है, बल() ओएस को 'अब' लिखने के लिए कहेंगे, अन्यथा ओएस लिखता है जब ऐसा लगता है।

+0

मेरे पास एक सवाल है कि, जब बल निष्पादित हो रहा है, putInt() पर कोई प्रभाव? , int को बल() को पूरा करने के लिए मजबूर करना पड़ता है (') को बल() पर डाल दिया जाता है? – Jaskey

1

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6816049

बल() विंडोज पर बेकार है। बहुत डरावनी बग।

+0

याओ की टिप्पणी/उत्तर के अलावा कि अधिकांश उपयोगकर्ताओं के लिए कार्यान्वयन पर्याप्त था, इसलिए जुड़ा हुआ बग जेआरई 7 बिल्ड 118 में तय किया गया है, वर्तमान जेवीएम प्रभावित नहीं हैं। –

3

मैप्डबेटबफर.फोर्स() विंडोज़ में बेकार नहीं है। फ़ाइल एक्सेस की निगरानी के लिए मैंने http://technet.microsoft.com/en-us/sysinternals/bb896645 से "प्रोसेस मॉनिटर" टूल का उपयोग किया। लॉगिंग के अनुसार, मैप्डबेटबफर.फोर्स() तुरंत में गैर-कैश सिंक्रोनस मोड में Windows API WriteFile() को कॉल करेगा। विश्वसनीयता FileChannel.force() के समान होनी चाहिए जो फ़ाइल API लिखने के लिए तुरंत Windows API FlushFileBuffers() को कॉल करेगी। इसलिए, MappedByteBuffer.force() अधिकांश प्रकार के उपयोगों के लिए पर्याप्त विश्वसनीय है। जावा 1.6.0_24 के साथ विंडोज 7 64 बिट पर परीक्षण किया गया।

+1

यह प्रश्न का उत्तर नहीं प्रदान करता है। किसी लेखक से स्पष्टीकरण की आलोचना या अनुरोध करने के लिए, अपनी पोस्ट के नीचे एक टिप्पणी छोड़ दें। - [समीक्षा से] (/ समीक्षा/कम गुणवत्ता वाली पोस्ट/10941104) – AtheistP3ace

+0

जब मैंने इस पोस्ट को लिखा था तो मुझे एक पोस्ट के नीचे टिप्पणी जोड़ने का अधिकार नहीं था। यही कारण है कि मैंने एक नई पोस्ट बनाई। – Yao