2012-09-21 11 views
5

मुझे अपने जावा आईओ प्रदर्शन के साथ कुछ परेशानी हो रही है।जावा आईओ प्रदर्शन एक्सओआर 2 फाइलों के साथ

सबसे पहले, मैंने प्रदर्शन के बारे में यहां अपनी युक्तियां पढ़ी हैं, जिन्हें मैंने कार्यान्वित करने का प्रयास किया था।

छोटे फ़ाइलों के साथ

(400MB तक), यह बहुत तेजी से है:

लेकिन यहाँ मेरी समस्या है। लेकिन जिन वास्तविक फाइलों के साथ मैं काम करूँगा वे लगभग 30 जीबी हैं। और इनके साथ, यह नरक की तरह धीमा हो जाता है।

यह क्या करता है: 2 फ़ाइलें लें, अनन्य करें या एक नई फ़ाइल लिखें।

बीटीडब्ल्यू: अंत में फ़ाइल कटौती के बारे में चिंता न करें। यह एक छोटी सी गलती को ठीक करने के लिए है जिसे मैंने अभी तक नहीं मिला है।

मुझे आशा है कि किसी के पास मेरे लिए एक टिप है। धन्यवाद।

सादर टीमो

import java.io.File; 
import java.io.IOException; 
import java.io.RandomAccessFile; 
import java.nio.ByteBuffer; 
import java.nio.channels.FileChannel; 

public class main { 
    public static void main(String[] args) throws IOException { 

     final long start = System.currentTimeMillis(); 
     // Init. FileChannel1 
     final File file1 = new File("/home/tmann/Downloads/test/1.zip"); 
     final RandomAccessFile fis1 = new RandomAccessFile(file1, "rw"); 
     final FileChannel ch1 = fis1.getChannel(); 

     // Init. FileChannel2 
     final File file2 = new File("/home/tmann/Downloads/test/2.zip"); 
     final RandomAccessFile fis2 = new RandomAccessFile(file2, "rw"); 
     final FileChannel ch2 = fis2.getChannel(); 
     // Init FileChannel3 
     final File file3 = new File("/home/tmann/Downloads/test/32.zip"); 
     final RandomAccessFile fis3 = new RandomAccessFile(file3, "rw"); 
     final FileChannel ch3 = fis3.getChannel(); 
     // Init ByteBuffer1 

     final ByteBuffer bytebuffer1 = ByteBuffer.allocate(65536); 
     // Init ByteBuffer2 
     final ByteBuffer bytebuffer2 = ByteBuffer.allocate(65536); 
     // Init ByteBuffer3 
     final ByteBuffer bytebuffer3 = ByteBuffer.allocate(65536); 


     int byte1 = 0; 
     int byte2 = 0; 

     final byte[] array1 = bytebuffer1.array(); 
     final byte[] array2 = bytebuffer2.array(); 
     final byte[] array3 = bytebuffer3.array(); 

     int count = 0; 

     while (byte1 != -1) { 
      byte1=ch1.read(bytebuffer1); 
      byte2=ch2.read(bytebuffer2); 
       while (count < byte1) { 
         array3[count] = (byte) (array1[count]^array2[count]); 
         count++; 
             } 

      bytebuffer3.put(array3); 

      bytebuffer1.flip(); 
      bytebuffer2.flip(); 
      bytebuffer3.flip(); 

       while (bytebuffer3.hasRemaining()) { 
         ch3.write(bytebuffer3); 
                } 

      bytebuffer1.clear(); 
      bytebuffer2.clear(); 
      bytebuffer3.clear(); 

     } 

     fis3.setLength(fis3.length()-59858); 
     final long endvar = System.currentTimeMillis(); 
     System.out.println((500.0/((endvar - start)/1000f)) + "MB/s"); 

    } 
} 
+3

यदि आपके पास 64-बिट JVM है तो मैं मेमोरी मैप की गई फ़ाइलों का उपयोग करूंगा। यदि आप कर सकते हैं तो मैं एक बाइट के बजाय एक्सओआर भी लम्बा होगा (यह 8x तेज हो सकता है) –

+1

एक्सओआर लम्बे समय में एक अच्छी गति लाए, धन्यवाद। :) – user1688035

उत्तर

2

क्यों आप एक RandomAccessFile जरूरत है यह क्रमिक रूप से पढ़ने के लिए चाहते हैं?

क्या आपने वहां एक FileInputStream पर एक साधारण BufferedInputStream का उपयोग करने का प्रयास किया है?

+1

+1 मुझे संदेह है कि वह RandomAccessFile का उपयोग कर रहा है क्योंकि इसे पढ़ने और लिखने के लिए उपयोग किया जाता है। इसके बजाय FileInputStream और FileOutputStream का उपयोग किया जा सकता है। –

+0

मैं एक "फाइल में" लिखूंगा या इसे फ़ाइल संपादित कर दूंगा। मैंने इन्हें भी कोशिश की ... धीमी .. ..( – user1688035

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