2012-05-10 10 views
10

मैं विंडोज शेयरों तक पहुंचने के लिए बस JCIFS का परीक्षण कर रहा था। यह पूरी तरह से अनुपयोगी होने के बिंदु पर बहुत धीमी है।जेसीआईएफएस: फ़ाइल पुनर्प्राप्ति उपयोग करने योग्य बहुत धीमी है

import jcifs.smb.*; 

class First { 
    public static void main(String[] args) throws Exception { 
    try { 
     //jcifs.Config.setProperty("jcifs.netbios.wins", "192.168.1.220"); 
     NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain.com", "Administrator", "password"); 

     SmbFile f = new SmbFile("smb://10.17.15.12/Share/xml/file.xml", auth); 
     SmbFileInputStream in = new SmbFileInputStream(f); 
     byte[] b = new byte[8192]; 
     int n; 
     while((n = in.read(b)) > 0) { 
     System.out.write(b, 0, n); 
     } 
    } catch (SmbException smbe) { 
     System.err.println(smbe.getNtStatus()); 
     System.err.println(smbe.toString()); 
     System.err.println(smbe.getCause()); 
    } 
    } 
} 

प्रारंभिक आउटपुट आने में बहुत लंबा समय लगता है और बाद में पढ़ने भी बहुत धीमी होती है। कोई विचार यह कैसे उपयोग करें? किसी भी विकल्प जिसके द्वारा मैं पोर्टेबल तरीके से विंडोज शेयरों तक पहुंचने के लिए जावा कोड लिख सकता हूं, भी

उत्तर

18

मुझे कहीं पता चला कि SmbFileInputStream अपने स्वयं के बफरिंग नहीं करता है और इसलिए धीमा होने का कारण नहीं है। BufferedInputStream में SmbFileInputStream को लपेटने से समस्या हल हो गई।

SmbFile sFile = new SmbFile(path, authentication); 

BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(sFile)); 
+2

मुझे पता है कि यह एक पुराना उत्तर है, लेकिन स्रोत-लिंक अप्रचलित प्रतीत होता है। – Vish

2

यदि आप शेयर को माउंट करने के लिए "कुछ और" पर भरोसा कर सकते हैं तो स्थानीय निर्देशिका के रूप में, फिर फ़ाइलों को पढ़ना जावा में घुड़सवार हिस्सा पोर्टेबल होना चाहिए।

भले ही यह वास्तविक समाधान न हो, फिर भी यह देखने के लायक होगा कि आपको तेजी से पढ़ने की दर मिलती है या नहीं। पोर्टेबिलिटी के सापेक्ष महत्व के बारे में एक महत्वपूर्ण तेज़ी से पढ़ने की दर आपके दिमाग को बदल सकती है। और यदि आपको कोई महत्वपूर्ण गति नहीं मिलती है, तो आपको पता चलेगा कि जेसीआईएफएस को दोष नहीं देना है ...

15

मेरे अपने मामले में, जेसीआईएफएस के माध्यम से फ़ाइलों को विंडोज़ शेयर में धक्का देना बहुत धीमा था।

समाधान निकला संपत्ति

 
-Djcifs.resolveOrder=DNS 

BCAST की default inclusion को परिभाषित किए जाने की - 255.255.255.255 करने के लिए एक NetBIOS नाम क्वेरी प्रसारण - बेकार में एक लंबी देरी में जिसके परिणामस्वरूप किया गया था। (। De-फंसाया top-level API docs से ऊपर लिंक)

+0

यह एक अच्छा खोज है! – Xolve

+1

धन्यवाद! निश्चित रूप से एक सप्ताह के लिए मेरे नीचे लात मार दिया .... – Glenn

+3

jcifs.Config.setProperty ("resolOrder", "DNS"); मेरे जीवन को भी बचाया! धन्यवाद!! – Exceptyon

2

क्या मैंने देखा है कि jCIFS "कुछ" (हर हिस्सा इसे पढ़ता है के लिए afair jcifs.smb.SmbTransport.checkStatus(..)) करता है -। प्रत्येक हिस्सा है कि बफर में पढ़ा जाता है के लिए अर्थात एक BufferedInputStream का उपयोग कर इसका मतलब है कि वास्तव में चीजों को गति दे सकता है, लेकिन असली समस्या अभी भी मौजूद है। यह केवल पहले की तरह नहीं होती है और इसलिए समग्र समय पर कम प्रभाव पड़ता है ..

यह "jcifs.util" को सेट करने में बहुत मदद करता है .loglevel = 3 "और देखें कि वास्तव में क्या गलत है!

मेरे मामले में मुझे "jcifs.smb.client.dfs.disabled=false" अंत में 0 के रूप में सेट करना पड़ामदद नहीं की ..

1

यहां तक ​​कि मौजूदा सुझावों के साथ भी मुझे अपने स्थानीय नेटवर्क पर वीडियो स्ट्रीम करने के लिए जेसीआईएफएस बहुत धीमा पाया गया। यह नेटवर्क से पढ़ने वाले ओवरहेड प्रति बफर के साथ किया जाता है, यहां तक ​​कि बड़े बफर में भी पढ़ना जेसीआईएफएस के पास सीमित बफर आकार था जो समस्या थी।

यदि आप https://jcifs.samba.org/src/patches/ में देखते हैं तो एक पैच, LargeReadWrite.patch है। आपको पैच को लागू करने और कोड का उपयोग करने के लिए इसे पुनर्निर्माण करने की आवश्यकता होगी, लेकिन इससे मेरे लिए बड़ा अंतर आया।

+0

उत्कृष्ट खोज :-) – Xolve

0

@ Xolve0 द्वारा जोड़ा गया समाधान मेरे लिए भी काम करता है। फ़ाइलों को लिखने का प्रयास करते समय SmbFileInput में बफर समस्या भी मौजूद है। मैंने 0seका उपयोग किया था ताकि सादे पाठ फ़ाइल के लिए 90secs से एक सेकंड से भी कम समय तक निष्पादन कम हो सके।

इस विशिष्ट मुद्दे की पहचान करने का एक त्वरित तरीका JCIFS पथ और फ़ाइल के लेखन के उद्घाटन के बीच का समय ट्रैक करना होगा।

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