2016-06-28 74 views
0

我有以下將大型映像寫入磁盤的代碼。我的應用程序服務器正在運行的內存,我想知道如果我能以某種方式優化如下:優化將字節數組映像寫入磁盤的代碼

public void writeImgToDisk(byte[] base64AttachmentInBytes, String dmxi){ 

     String destinationAndFileName = ""; 
     String fileNameMinusExtension = getCurrentTimeStampForFileNaming(); 
     String extension=""; 
     try { 


       TikaConfig config = TikaConfig.getDefaultConfig(); 
       InputStream stream = new ByteArrayInputStream(base64AttachmentInBytes); 

       MediaType mediaType = config.getMimeRepository().detect(stream, new Metadata()); 
       MimeType mimeType; 


      try { 
       mimeType = config.getMimeRepository().forName(mediaType.toString()); 
       extension = mimeType.getExtension(); 
       System.out.println("Extension is:"+ extension); 

       File folder = new File("Z:\\images\\"+ sref); 
       if (!folder.exists()){ 
        folder.mkdir(); 
       } 
       destinationAndFileName = "Z:\\images\\"+ dmxi + "\\" + fileNameMinusExtension+ extension; 

       System.out.println("destinationAndFileName is:"+ destinationAndFileName); 
      } catch (MimeTypeException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 

      InputStream input = new ByteArrayInputStream(base64AttachmentInBytes); 
      OutputStream output = new FileOutputStream(destinationAndFileName); 
      IOUtils.copy(input, output); 


      System.out.println("It was written.."); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 

這工作,但它是一個瓶頸,在高容量呼叫的原因。

+0

CodeReview.stackexchange.com將是一個很好的地方。 – Qix

+1

而不是在內存中有整個字節數組(base64AttachmentInBytes),然後繞着'read'ing循環說8K字節,然後寫入它們。即直接使用'ByteArrayInputStream'上的方法而不是'IOUtils' –

+0

請參閱此頁上的第一個示例http://www.studytrails.com/java-io/byte-reading-writing.jsp –

回答

0

有你的代碼更改:使用IOUtils.copy和你自己控制自己的IO

  1. 避免。
  2. 爲您的機箱和機器設置測試不同的IO類。
  3. 按照此鏈接中提到的基本故障排除步驟進行操作。 http://www.oracle.com/technetwork/articles/javase/perftuning-137844.html

我發現選擇一個緩衝大小是重要的,這些技巧是克服內存瓶頸超級有用: 這裏是關於如何加快I/O的一些基本規則:

Avoid accessing the disk. 
Avoid accessing the underlying operating system. 
Avoid method calls. 
Avoid processing bytes and characters individually. 
0

我遵循@pvg和@scaryWombat的建議。爲了檢測mimetype,我停止了整個文件的閱讀。然後,我使用iHarder的Base 64解碼,並將我的base64符號字符串直接寫入文件中。

爲了檢測mimetype我解碼了前100個字符的子字符串。

相關問題