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)