是否有针对在Java中将MD5哈希应用于并行文件集的行为改变的解释?

问题描述 投票:0回答:1

全部!

我正试图找到一种更快的方法来计算大型文件的MD5和,以识别出于个人目的的重复项。

我正在使用Timothy Macintha快速哈希实现(here)来完成工作。

在将md5总和应用于每个文件时,我尝试了三种不同的方法:遍历集合,使用流和使用parallelStream。

我发现,在带有大文件的小型设备上,并行方法在很大程度上远远优于其他两个方法。

但是,如果文件集很大且文件较小,则传统方法和流方法要快得多。

结果(每种方法每个文件的毫秒数)如下: inof

并行方法的性能变化是否有原因?

将md5和存储在新集中是否会对列出的任何方法产生不利影响?

我用于三种方法的代码如下:

private static long applyHash(Set<File> files) {
    Long start = System.currentTimeMillis();

    files.stream()
            .forEach(file -> {
                try {
                    MD5.asHex(MD5.getHash(file));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
    Long end = System.currentTimeMillis();
    return (end - start);
}

private static long applyParallelHash(Set<File> files) {
    Long start = System.currentTimeMillis();

    files.parallelStream()
            .forEach(file -> {
                try {
                    MD5.asHex(MD5.getHash(file));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
    Long end = System.currentTimeMillis();
    return (end - start);
}

private static long applyConventionalHash(Set<File> files) {
    Long start = System.currentTimeMillis();

    for (File file:files) {
        try {
            MD5.asHex(MD5.getHash(file));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    Long end = System.currentTimeMillis();

    return (end - start);
}
java algorithm io md5
1个回答
0
投票

我查看了您提到的MD5库的源代码,据了解,MD5.getHash使用旧io api(FilterInputStream)的阻塞操作,这在处理并行流时会导致性能下降。

[为了更好地理解,请查看https://dzone.com/articles/java-nio-vs-io中的“阻塞与非阻塞IO”部分

© www.soinside.com 2019 - 2024. All rights reserved.