2012-09-21 11 views
5

Java IO Performansım ile ilgili bir sorun yaşıyorum.Java IO Performansı XOR 2 Dosyaları ile

Her şeyden önce, uygulamamı denediğim performans hakkında ipuçlarını burada okudum. (400MB kadar) küçük dosyalar ile

, oldukça hızlıdır:

Ama burada benim Sorun olduğunu. Ama çalışacağım gerçek dosyalar yaklaşık 30 GB.Ve bunlar ile birlikte, cehennem gibi yavaşlatır.

Ne yapar: 2 Dosya alın, özel yapın ve yeni bir Dosya yazın.

BTW: Sonunda dosya kestirme hakkında endişelenme. Bu, henüz bulamadığım küçük bir hatayı düzeltmektir.

Umarım birinin benim için bir ipucu vardır. Teşekkürler.

Selamlar Timo

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-bit JVM'niz varsa, bellek eşlemeli dosyaları kullanırdım. Aynı zamanda XOR, bir seferde bir bayt yerine uzun sürebilirdi (eğer bu 8x'e kadar daha hızlı olabilir) –

+1

XOR longs, güzel bir hız getirdi, teşekkürler. :) – user1688035

cevap

2

Neden sırayla okumak için bir RandomAccessFile gerekir?

Orada bir FileInputStream üzerinde basit bir BufferedInputStream kullanmayı denediniz mi?

+1

+1 RandomAccessFile'ı okumak ve yazmak için kullanacağından şüpheleniyorum. FileInputStream ve FileOutputStream bunun yerine kullanılabilir. –

+0

"Dosyaya" yazacağım ya da dosyayı düzenleyeceğim.Ayrıca bunları da denedim ... daha da yavaş .. :( – user1688035