2012-09-21 9 views
5

Ho qualche problema con la mia performance IO Java.Prestazioni IO di XOR XOR con 2 file

Prima di tutto, ho letto i miei suggerimenti qui sulle prestazioni, che ho provato ad implementare.

Ma qui è il mio problema:

con file di piccole dimensioni (fino a 400MB), è abbastanza veloce. Ma i file reali con cui lavorerò sono circa 30 GB. E con questi, rallenta come un matto.

Cosa fa: prendi 2 file, fai l'esclusivo o e scrivi un nuovo file.

BTW: Non preoccuparti del taglio del file alla fine. È sufficiente correggere un piccolo errore che non ho ancora trovato.

Spero che qualcuno abbia un consiglio per me. Grazie.

Saluti 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

Se si dispone di una JVM a 64 bit, utilizzerei i file mappati in memoria. Vorrei anche XOR long invece di un byte alla volta se è possibile (questo può essere fino a 8 volte più veloce) –

+1

XOR long ha portato una bella accelerazione, grazie. :) – user1688035

risposta

2

Perché avete bisogno di un RandomAccessFile di leggerlo in sequenza?

Hai provato a utilizzare un semplice BufferedInputStream su un FileInputStream?

+1

+1 Sospetto che stia usando RandomAccessFile come si usa per leggere e scrivere. FileInputStream e FileOutputStream potrebbero invece essere usati. –

+0

Implementerò un file "in file" o lo chiamerò file di modifica. Ho anche provato questi ... anche più lentamente .. :( – user1688035

Problemi correlati