2014-03-15 1 views
3

Мой SQLite db-файл размером 85 МБ сжимается с использованием формата XZ, а его размер уменьшен до 16 МБ. Я использую следующий код (и JAR обеспечивается XZ for Java), чтобы разархивировать его в Android Jelly Bean:Как быстро распаковывать XZ-файл в Java?

try { 
    FileInputStream fin = new FileInputStream(path + "myFile.xz"); 
    BufferedInputStream in = new BufferedInputStream(fin); 
    FileOutputStream out = new FileOutputStream(des + "myDecompressed"); 
    XZInputStream xzIn = new XZInputStream(in); 
    final byte[] buffer = new byte[8192]; 
    int n = 0; 
    while (-1 != (n = xzIn.read(buffer))) { 
     out.write(buffer, 0, n); 
    } 
    out.close(); 
    xzIn.close(); 
} 
catch(Exception e) { 
    Log.e("Decompress", "unzip", e); 
} 

Декомпрессия выполняется успешно, но это займет больше двух минут. Я думаю, что это очень долго, потому что сжатый файл имеет только 16 МБ, а несжатый файл - только 85 МБ.

Интересно, сделал ли я что-то неправильно с кодом или есть способ ускорить этот процесс распаковки.

+0

Что об этом: https://www.sqlite.org/fts3.html, см. Параметр сжатия – pskink

+0

О, я забыл отметить, что мой sqlite db уже является компактным. –

+0

, значит, вы имеете в виду, что он уже сжат? и хотя xz сокращает его до 20% от исходного размера? – pskink

ответ

1

Наименьшая вы должны сделать, это обернуть FileOutputStream ИНТ в BufferedOutputStream, существует очень мало случаев, когда вы не должны использовать BufferedInputStream/BufferedOutputStream. Попробуйте и посмотрите, сколько времени это займет сейчас.

+0

Не могли бы вы сделать это немного понятнее? –

+0

Я имею в виду вместо 'FileOutputStream out = new FileOutputStream (des +" myDecompressed ");', сделать его 'BufferedOutputStream out = new BufferedOutputStream (новый FileOutputStream (des +" myDecompressed "));' – Kai

+0

Спасибо, но это не удача. Для распаковки этого файла требуется более двух минут! –

2

Я думаю, что вы можете сделать это, чтобы сделать это быстрее. Если для распаковки 16Mb до 85Mb требуется 2 минуты, вероятность того, что большая часть этого времени будет потрачена на фактическую декомпрессию, а значительная часть остального находится в фактическом вводе-выводе файлов ... на физическом уровне.

Конечно, нет ничего явно неэффективного в вашем коде. Вы читаете, используя BufferedInputStream и декодирование/запись, используя большой буфер. Таким образом, вы будете эффективно выполнять работу с системами ввода-вывода. (Добавление BufferedOutputStream не будет никакой разницы, потому что вы уже делаете запись больших объемов из буфера 8192 байт.)


Лучшее, что я могу предложить, что вы свой код, чтобы увидеть, где горячие точки на самом деле. Но я подозреваю, что вы не найдете ничего, что можно улучшить, чтобы изменить ситуацию.


Я хочу пойти на XZ, потому что он имеет лучший уровень сжатия в моем случае, что несколько экономит время загрузки ... (с ЗИП, разархивирования этого файла занимает всего около 15 секунд!

Ну, дополнительное процессорное время декомпрессии является цена, которую вы платите за использование алгоритма сжатия коленчатой ​​до макс вы должны решить, что более важно для пользователей:. более быстрой загрузки, или быстрее декомпрессии (установка ?) базы данных.

FWIW, распаковка ZIP, вероятно, реализована в родной библиотеке, а не в чистой Java. Это, безусловно, для JVM Oracle/OpenJDK.

 Смежные вопросы

  • Нет связанных вопросов^_^