我有10000至12000个图像文件,外部存储空间最大为800 MB。
我正在使用一个循环,该循环采用每个文件路径并生成它的md5,但是由于要读取大量文件来创建md5,因此需要很多时间。
这是用于生成文件md5的算法。
public static String getMd5OfFile(String filePath) {
String returnVal = "";
try {
InputStream input = new FileInputStream(filePath);
// byte[] buffer = new byte[1024];
byte[] buffer = new byte[2048];
MessageDigest md5Hash = MessageDigest.getInstance("MD5");
int numRead = 0;
while (numRead != -1) {
numRead = input.read(buffer);
if (numRead > 0) {
md5Hash.update(buffer, 0, numRead);
}
}
input.close();
byte[] md5Bytes = md5Hash.digest();
for (int i = 0; i < md5Bytes.length; i++) {
returnVal += Integer.toString((md5Bytes[i] & 0xff) + 0x100, 16).substring(1);
}
} catch (Throwable t) {
t.printStackTrace();
}
return returnVal.toUpperCase();
}
所以问题是我可以增加缓冲区大小以使操作更快吗?应该执行多少操作,这既不会中断操作,也不会导致生成md5。
将缓冲区流包装在输入流中是否会使其更快?
答案 0 :(得分:0)
与任何优化问题一样,您应该衡量性能以了解所做的任何更改是否会产生影响。
2k当然是较小的缓冲区,而较大的缓冲区可能会做得更好。但是I / O堆栈的缓冲区一直向下,因此影响可能微不足道。尝试衡量自己。
另一个值得尝试的优化措施是,读取文件是I / O绑定的操作,而计算MD5是CPU绑定的。有一个线程读取文件内容,而另一个线程仅更新MD5状态。根据设备上CPU内核的数量,您可以并行散列多个文件,以提高性能。