2010-10-23 21 views
16

जावा में बड़ी संख्या में फ़ाइलों की प्रतिलिपि बनाने का सबसे तेज़ तरीका क्या है। अब तक मैंने फ़ाइल स्ट्रीम और एनओओ का उपयोग किया है। कुल मिलाकर धाराएं एनओओ से तेज लगती हैं। अब तक आपने क्या अनुभव किए हैं?जावा में फ़ाइलों की प्रतिलिपि बनाने का सबसे तेज़ तरीका

+2

क्या आप फ़ाइलों की प्रतिलिपि बना रहे हैं जैसे आप उन्हें कॉपी करते हैं? क्यों न केवल ओएस के फाइल सिस्टम कार्यों का उपयोग करें? –

+0

नहीं, मैं कोई परिवर्तन नहीं कर रहा हूं। लेकिन छोटी फ़ाइलों की प्रतिलिपि करते समय 10,000+ फ़ाइलों की प्रतिलिपि बनाने और सिस्टम थ्रेड को बढ़ाने के ऊपरी हिस्से में त्रुटि प्रबंधन बहुत कठिन होगा। – Mato

+0

मैं आपको अपनी बाधाओं को शामिल करने के लिए अपना प्रश्न संशोधित करने की सलाह देता हूं। –

उत्तर

19

http://www.baptiste-wicht.com/2010/08/file-copy-in-java-benchmark/ आप अपने जवाब मिल सकता है।

बेंचमार्क के लिए, मैंने विभिन्न फ़ाइलों का उपयोग करके परीक्षण किए।

  1. लिटिल फ़ाइल (5 KB)
  2. मध्यम फ़ाइल (50 KB)
  3. बिग फ़ाइल (5 एमबी)
  4. फैट फ़ाइल (50 एमबी)
  5. और एक विशाल फ़ाइल (1.3 जीबी) केवल बाइनरी

और मैंने टेक्स्ट फ़ाइलों का उपयोग करके पहले परीक्षण किया और फिर बाइनरी फ़ाइलों का उपयोग किया। मैंने तीन मोड में प्रयोग किए गए परीक्षण किए:

  1. उसी हार्ड डिस्क पर। यह 8 जीबी कैश के साथ 250 जीबी की आईडीई हार्ड डिस्क है। यह Ext4 में स्वरूपित है।
  2. दो डिस्क के बीच। मैंने 16 एमबी कैश के साथ पहली डिस्क और 250 जीबी की एक अन्य सैटा हार्ड डिस्क का इस्तेमाल किया। यह Ext4 में स्वरूपित है।
  3. दो डिस्क के बीच। मैंने 32 एमबी कैश के साथ पहली डिस्क और 1 टीबी की एक अन्य सैटा हार्ड डिस्क का इस्तेमाल किया। यह NTFS का उपयोग करके स्वरूपित है।

मैंने सभी विधियों के परीक्षण करने के लिए एक बेंचमार्क फ्रेमवर्क, described here का उपयोग किया। परीक्षण मेरे व्यक्तिगत कंप्यूटर (उबंटू 10.04 64 बिट्स, इंटेल कोर 2 डुओ 3.16 गीगा, 6 गो डीडीआर 2, सैटा हार्ड डिस्क) पर किए गए हैं। इस्तेमाल किया जावा संस्करण एक जावा 7 64 बिट्स वर्चुअल मशीन है ...

+1

धन्यवाद, यह मेरे प्रश्न का उत्तर देता है – Mato

1

एक ओएस बैच स्क्रिप्ट से जावा कांटा है जो फ़ाइलों की प्रतिलिपि बनाता है। आपके कोड को बैच स्क्रिप्ट लिखना पड़ सकता है।

+1

इसके बारे में पहले से ही सोचा गया है लेकिन छोटी फ़ाइलों की प्रतिलिपि करते समय 10,000+ फ़ाइलों की प्रतिलिपि बनाने और सिस्टम थ्रेड को बढ़ाने के ऊपरी हिस्से में त्रुटि प्रबंधन करना मुश्किल होगा। इसके अलावा ऐप मंच स्वतंत्र नहीं होगा। – Mato

+0

1. आपको वैसे भी त्रुटि जांच को संभालना होगा। 2. आप सही हैं कि यह मंच स्वतंत्र नहीं होगा - तो आप इसे विभिन्न प्रकार के सर्वरों पर चलाने का इरादा रखते हैं? 3. क्या आप 'उचित' जगह में 10,000 फाइलें शुरू कर सकते हैं और प्रतिलिपि की आवश्यकता नहीं है? 4. प्रति फ़ाइल एक थ्रेड स्पॉन मत करो। एक थ्रेड प्रति 100 फाइलें या कुछ। –

+0

मैं इसके साथ सहमत हूं। फ़ाइलों की गूंगा प्रतिलिपि जावा का आदर्श उपयोग मामला नहीं है। यदि आप जावा से ऐसा करना चाहते हैं, तो ओएस स्तर कॉल को फोर्क करें। – bwawok

9

मैं का प्रयोग करेंगे:

import java.io.*; 
import java.nio.channels.*; 

public class FileUtils{ 
    public static void copyFile(File in, File out) 
     throws IOException 
    { 
     FileChannel inChannel = new 
      FileInputStream(in).getChannel(); 
     FileChannel outChannel = new 
      FileOutputStream(out).getChannel(); 
     try { 
      inChannel.transferTo(0, inChannel.size(), 
        outChannel); 
     } 
     catch (IOException e) { 
      throw e; 
     } 
     finally { 
      if (inChannel != null) inChannel.close(); 
      if (outChannel != null) outChannel.close(); 
     } 
    } 

    public static void main(String args[]) throws IOException{ 
     FileUtils.copyFile(new File(args[0]),new File(args[1])); 
    } 
} 

आप इस को देखने के लिए आवश्यकता हो सकती है आपकी फ़ाइलों के किसी भी Windows में 64M से भी बड़ा कर रहे हैं: http://forums.sun.com/thread.jspa?threadID=439695&messageID=2917510

+7

पकड़ (IOException ई) { फेंक ई; } <--- अच्छा एक – unbeli

+0

यह सिर्फ नमूना कोड है। –

+1

धन्यवाद यह मेरे द्वारा उपयोग किए जा रहे कार्यों की तुलना में काफी तेज़ था! –

1

आप फ़ाइल की प्रतिलिपि करने

FileUtils.copyFile(new File(sourcePath), new File(destPath)); 

कौन सा आईओ के लिए FileChannel का उपयोग करता है Apache Commons-कब पुस्तकालय में से किसी FileUtils कार्यान्वयन का उपयोग कर सकते ऑपरेशन।

या java.nio.file.Files की copy() विधि का उपयोग करें।

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

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