优化将字节数组图像写入磁盘的代码



我有以下代码,这些代码将大图磁盘写入磁盘。我的应用程序服务器用完了内存,我想知道我是否可以以某种方式优化以下内容:

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();
        }
    }

这起作用,但这是在高音量通话中造成瓶颈的原因。

您的代码有更改:

  1. 避免使用ioutils.copy并自己控制您的IO。
  2. 为您的情况和机器设置测试不同的IO类。
  3. 按照此链接中提到的基本故障排除步骤。http://www.oracle.com/technetwork/articles/javase/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.

我遵循@pvg和@scaryWombat给出的建议。我停止在整个文件中阅读,以便检测模仿。然后,我使用iharder的基本64来解码并将我的base64符号字符串直接写入一个单个swoop中。

为了检测模拟型,我仅解码了前100个字符的子字符串。

最新更新