我有以下代码,这些代码将大图磁盘写入磁盘。我的应用程序服务器用完了内存,我想知道我是否可以以某种方式优化以下内容:
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();
}
}
这起作用,但这是在高音量通话中造成瓶颈的原因。
您的代码有更改:
- 避免使用ioutils.copy并自己控制您的IO。
- 为您的情况和机器设置测试不同的IO类。
- 按照此链接中提到的基本故障排除步骤。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个字符的子字符串。