Оптимизация процесса разархивирования в Java?

1

У меня есть проблема с временем, требуемым для файлов.gz, чтобы получить несжатый код с помощью следующего кода:

import java.io.*;
import java.util.zip.*;

public class UnGunzipClass{

    public static boolean ungunzip(String compressedFile, String decompressedFile){

        try{

            // in
            FileInputStream fileIn          = new FileInputStream(compressedFile);
            GZIPInputStream gZipIn          = new GZIPInputStream(fileIn);
            BufferedInputStream in          = new BufferedInputStream(gZipIn);

            // out
            FileOutputStream fileOut        = new FileOutputStream(decompressedFile);
            BufferedOutputStream out        = new BufferedOutputStream(fileOut);

            int n = 0;
            int len = 1024*1024*1024;
            byte[] buffer = new byte[len];

            while((n = in.read(buffer,0,len)) > 0){
                out.write(buffer,0,n);
            }

            gZipIn.close();
            fileOut.close();

            return true;

        } catch (IOException e){
            e.printStackTrace();
            return false;
        }
    }
}

Примечание: файлы до 100 Мбайт, но мне все равно требуется десятки минут для запуска, поэтому я пытаюсь получить что-то быстрее. Скорость хорошая :)

  • 1
    Вы действительно нуждаетесь в 1 ГБ буфера памяти (не это должно иметь значение по скорости)?
  • 0
    n = in.read(buffer,0,n) . Этот последний n кажется неправильным. должен быть buffer.length .
Показать ещё 2 комментария
Теги:
optimization
performance
gunzip

1 ответ

2
Лучший ответ

Вы создали BufferedInputStream из GZIPInputStream, для производительности вы бы сделали это в обратном порядке. Кроме того, я предлагаю вам уменьшить размер вашего буфера (и использовать ваши буферизованные потоки). Наконец, я бы использовал приложение try-with-resources которое могло бы выглядеть примерно так:

public static boolean ungunzip(String compressedFile,
        String decompressedFile) {
    final int BUFFER_SIZE = 32768;
    try (InputStream in = new GZIPInputStream(new BufferedInputStream(
            new FileInputStream(compressedFile)), BUFFER_SIZE);
            OutputStream out = new BufferedOutputStream(
                    new FileOutputStream(decompressedFile), BUFFER_SIZE)) {
        int n = 0;
        byte[] buffer = new byte[BUFFER_SIZE];
        while ((n = in.read(buffer, 0, BUFFER_SIZE)) > 0) {
            out.write(buffer, 0, n);
        }
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    }
    return false;
}
  • 0
    Это все еще медленно, но я думаю, что это так же быстро, как и получается :) спасибо!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню