2012-12-22 17 views
10

में एफटीपी अपलोड धीमा क्यों है मैं पूछना चाहता हूं कि कोई भी एफ़टीपी के साथ किसी भी जावा 7 मुद्दों के बारे में जानता है या नहीं? मैंने सूर्य नेट और अपाचे कॉमन्स नेट लाइब्रेरी दोनों का उपयोग किया है और दोनों जावा 6 पर अपेक्षित प्रदर्शन करते हैं। लेकिन जब मैं अपने देव पर्यावरण (ग्रहण) को 1.7 पर स्विच करता हूं, वही ऑपरेशन वास्तव में धीमा (लगभग 4.5 से 8 केबी/एस) करता है, और ये स्थानीयहोस्ट सर्वर और LAN के भीतर एक अन्य सर्वर के लिए हैं।जावा 7

मैंने buffered धाराओं, बाइट-टू-बाइट स्थानांतरण, नागल एल्गोरिदम बंद करने और अपाचे सुविधा विधि storeFile() का उपयोग करने की कोशिश की है, अंततः अंततः स्थानीयहोस्ट पर गति करने के लिए प्रदर्शन कर रहा है लेकिन फिर से क्रॉल करने के लिए धीमा कर रहा है एक दूरस्थ सर्वर पर। मैं सभी मशीनों को राज्य भर में एफ़टीपी फ़िल्टरिंग बंद करने के लिए भी सेट करता हूं।

InputStream is = null; 
    OutputStream os = null; 
    try { 
     is = new BufferedInputStream(prepareInputStream(data)); 
     os = new BufferedOutputStream(prepareOutputStream(data)); 
     if (is == null || os == null) { 
      log.error("Can't build connection"); 
      return; 
     } 

     byte[] buf = new byte[4096]; 
     int c = 1; 

     while (c > 0) { 
      c = is.read(buf); 
      if (c > 0) 
      os.write(buf, 0, c); 
      data.incrCurrentPosition(); 
      fireStateChanged(data); 
     } 
     data.incrCurrentPosition(); 
    } catch (IOException e) { 
     log.error(e.getMessage(), e); 
     setEnabled(false); 
    } catch (Exception e) { 
     log.error(e.getMessage(), e); 
    } finally { 
     if (is != null) { 
      try { 
       is.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 
     if (os != null) { 
      try { 
       os.close(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

जैसा देखा जा सकता है, यह बहुत मानक कार्यान्वयन कोड है। फिर, जावा 6 में, चीजें वास्तव में जल्दी से ज़िप। जावा 7 में, यह सूर्य और अपाचे कॉमन्स पुस्तकालय दोनों के लिए 10 से 20 के कारक से धीमा हो जाता है। फ़ाइलज़िला जैसे एफ़टीपी क्लाइंट का उपयोग करना पुष्टि करता है कि एफ़टीपी सामान्य रूप से काम कर रहा है, इसलिए मुझे लगता है कि यह वास्तव में जावा 7 के साथ कुछ करने के लिए है। मैंने किसी समस्या के किसी भी उल्लेख के लिए ऑनलाइन तक खोद दिया लेकिन ज्यादातर, जो चीजें मैंने देखी थीं जावा 7 और विंडोज 7 फ़ायरवॉल संघर्ष।

किसी भी अंतर्दृष्टि के लिए अग्रिम धन्यवाद।

+1

प्रश्न: "मुझे लगता है कि यह वास्तव में जावा 7 के साथ कुछ करने के लिए है"। ए: मुझे सच में लगता है कि आप शायद सही हैं। जावा 6 के लिए संकलन करने का प्रयास करें, और जेआरई 6 और जेआरई 7 दोनों पर * समान * .class चलाने का प्रयास करें। मैं शर्त लगाऊंगा कि आप शायद अपने सिद्धांत की पुष्टि करें :) – paulsm4

+0

'डेटा' की कक्षा क्या है? – DWright

+0

खेद है कि मैं इस DWright को याद किया। मैंने हैंश मैप किए गए ऑब्जेक्ट्स से स्ट्रिंग्स तक मनमाने ढंग से डेटा प्रकारों की कोशिश की है, यह देखने के लिए कि क्या यह वास्तव में कारण था, लेकिन वे सभी जावा 6 में तेज और जावा 7 में धीमे हो गए। –

उत्तर

10

कृपया जांच करें कि आपके मौजूदा बफर आकार के साथ है:

ftpClient.getBufferSize(); 

यदि आपने इसे पहले से किसी अन्य चीज़ पर सेट नहीं किया है, तो यह शून्य (0) होगा।

ftpClient.setBufferSize(1048576);//1024*1024 

आप के रूप में पहले अपने वर्तमान मूल्य की जाँच कर सकते हैं:: इसलिए, यह एक उच्च मूल्य के लिए सेट

ftpClient.getBufferSize(); 

वैसे, स्वीकार किए जाते हैं जवाब, setBufferSize (0), नहीं था मेरे लिए काम। मैं अपाचे कॉमन्स के नवीनतम संस्करण का उपयोग करता हूं, इसलिए संभवतः समाधान पिछले संस्करणों के साथ काम करता था। यदि आप बफर आकार को शून्य पर सेट करते हैं, तो वर्तमान संस्करण में कोई बदलाव नहीं होगा।

+0

आपसे सहमत हैं। –

+0

इससे मुझे बड़ा समय मिला। धन्यवाद! – user2124871

+1

धन्यवाद। मैं उस समय 3.2 का उपयोग कर रहा था, और आप सही हैं, समस्या 3.3 में तय की गई है। आपके लिए स्वीकृत उत्तर बदलना। –

13

मुझे जावा 7 में सामान्य रूप से चलने वाली चीज़ों को पाने के लिए कम से कम पर्याप्त प्रकार का पता चला। मैंने इसे एफ़टीपी क्लाइंट के सेटबफर आकार (0) का उपयोग करके किया; दुर्भाग्यवश, मुझे नहीं लगता कि सूर्य के जावा 7 के सूर्य नेट कार्यान्वयन में एक समान विधि है। यह मेरे लिए महत्वपूर्ण नहीं है क्योंकि मैं अपाचे कॉमन्स नेट से काफी खुश हूं। उम्मीद है कि, ओरेकल उचित समय में इसके नीचे पहुंच जाएगा।

+0

धन्यवाद, इसने मेरे लिए समस्या हल की। कोई विचार क्यों यह मामला है? –

+0

वाह! मुझे एक ही समस्या थी और ftpClient.setBufferSize (0) को एक फ़ाइल के लिए 117 से 6 तक के अपलोड समय को छोड़ दिया! कार्यालय में एक अच्छा दिन मैं यही कहता हूं! – Volksman

5

वहाँ है एक ज्ञात प्रदर्शन जो 3.3 स्नैपशॉट में तय किया गया है नेट 3.2 कॉमन्स के साथ समस्या यह जो तुम यहाँ से प्राप्त कर सकते हैं:

https://repository.apache.org/content/groups/snapshots/commons-net/commons-net/3.3-SNAPSHOT/

यह है setBufferSize (0) एक वैध वैकल्पिक हल की तरह लगता है शायद सबसे अच्छा उचित ठीक स्नैपशॉट का उपयोग कर पाने के लिए - अगर आप स्नैपशॉट उपयोग करने के साथ ठीक कर रहे हैं;)

+0

सेटबफर आकार (0) मेरे मामले में काम नहीं किया। 3.3-स्नैपशॉट ने किया। धन्यवाद! –

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