Przyspieszenie kompresji

0

Witam. Chciałem przyspieszyć wykonywanie się kompresowania w tym kodzie


    /**
     * Metoda archiwizuje pliki
     * @throws FileNotFoundException
     * @throws IOException 
     */
    public void createArchive() throws FileNotFoundException,IOException
    {
        
        //Buufer zapewnia przenoszenie bajtow pomiedzy strumieniami
        byte[] buffer=new byte[1024];
        
        //Deklaracja i inicjacja strumieni
        FileOutputStream out  = new FileOutputStream(ARCHIVE_NAME);
        ZipOutputStream  zos = new ZipOutputStream(new BufferedOutputStream(out));
        BufferedInputStream   zis  = null;
        
        //Rozpoczynanie pakowania
        
        int length=PATH.size();
        
        for(int i=0; i<length;i++)
        {
            //Tworzenie obiektu pliku ktory ma zostac zarchiwizowany
            //Kolejne elementy archiwum reprezentowane są przez obiekty ZipEntry
            ZipEntry entry = new ZipEntry(PATH.get(i));
            
            //Dodanie pliku do strumienia
            zos.putNextEntry(entry);
            FileInputStream in=new  FileInputStream( new File(PATH.get(i)));
            zis=new BufferedInputStream(in,1024);
            
            //Zapisywanie
            int bytes;
            while((bytes = zis.read(buffer,0,1024)) >0)
            {
                zos.write(buffer, 0, bytes);
            }            
        }
        
        //Zamykamy strumienie
        zos.closeEntry();
        zos.close();       
        zis.close();
    }
    

Co można przyspieszyć? Użyłem strumieni. Musiałem coś przeoczyć bo jest wolniej jeszcze wolniej.

0
  1. Jak masz zasoby to kod opakuj w try / finally i w finally zrób zamykanie.
  2. Nie zamykasz wszystkich strumieni.
  3. Do ustawiania poziomu kompresji jest metoda setLevel w ZipOutputStream
  4. Polecam Apache Commons IO - ma metody jak IOUtils.closeQuietly, IOUtils.copy, itd które znacznie uprościłyby tutaj kod.
0

Czytaj większymi blokami o rozmiarze będącym wielokrotnością 8kB (8192B).

0

Dodałem buffor na 8k. W tym samym czasie prawie 100MB lepszy wynik. Pobawię się jeszcze w rożne poziomy kompresji i zobaczymy.

1 użytkowników online, w tym zalogowanych: 0, gości: 1