You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Robert Jansen (JIRA)" <ji...@apache.org> on 2016/07/15 19:18:20 UTC
[jira] [Commented] (COMPRESS-291) decompress .7z archive very very
slow
[ https://issues.apache.org/jira/browse/COMPRESS-291?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15379953#comment-15379953 ]
Robert Jansen commented on COMPRESS-291:
----------------------------------------
Sorry about the delay responding. It is way faster than it was. It took
about 35 seconds to decompress a typical dataset (with about 512MB
internal datafile) whereas the C version took about 20 seconds. The
getNextEntry() is also way faster.
> decompress .7z archive very very slow
> -------------------------------------
>
> Key: COMPRESS-291
> URL: https://issues.apache.org/jira/browse/COMPRESS-291
> Project: Commons Compress
> Issue Type: Improvement
> Components: Compressors
> Affects Versions: 1.9
> Environment: Windows 7 x64, jdk1.7.0_21 x64
> Reporter: Robert Jansen
> Priority: Minor
> Fix For: 1.11
>
>
> I have 7z archives with one large image and many small files. The following code decompresses to a directory and returns the largest file. It is glacially slow and not usable for GB size files:
> public File unSevenZipToDir(File sevenZipFile, File outputDir) {
>
> File imgFile = null;
> // Make sure output dir exists
> outputDir.mkdirs();
> if (outputDir.exists()) {
>
> //FileInputStream stream;
> try {
>
> FileOutputStream output = null;
> SevenZFile f7z = new SevenZFile(sevenZipFile);
> SevenZArchiveEntry entry;
> long maxSize = 0;
> while ((entry = f7z.getNextEntry()) != null) {
> if (entry != null) {
> String s = entry.getName();
> if (s != null) {
> long sz = entry.getSize();
>
> if (sz > 0) {
> int count;
> byte data[] = new byte[4096];
>
> String outFileName = outputDir.getPath() + "/"
> + new File(entry.getName()).getName();
>
>
>
>
>
> File outFile = new File(outFileName);
>
> // Extract only if it does not already exist
> if (outFile.exists() == false) {
> System.out.println("Extracting " + s + " => size = " + sz);
>
>
>
> FileOutputStream fos = new FileOutputStream(
> outFile);
>
> BufferedOutputStream dest = new BufferedOutputStream(
> fos);
>
> while ((count = f7z.read(data)) != -1) {
> dest.write(data, 0, count);
> }
>
> dest.flush();
> dest.close();
>
> } else {
> System.out.println("Using already Extracted " + s + " => size = " + sz);
> }
> if (s.endsWith(".h5") || s.endsWith(".tif") ||
> s.endsWith(".cos") || s.endsWith(".nitf")
> || s.endsWith(".ntf")
> || s.endsWith(".jpg") && sz > maxSize) {
> maxSize = sz;
> imgFile = new File(outFileName);
> }
> } // end sz > 0
> } // end s != null
> } // end if entry
> } // end while
> f7z.close();
> } catch (FileNotFoundException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> } catch (IOException e) {
> // TODO Auto-generated catch block
> e.printStackTrace();
> }
> }
> return imgFile;
> }
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)