Есть ли объяснение изменению поведения при применении MD5 ha sh параллельно к набору файлов в Java? - PullRequest
0 голосов
/ 19 января 2020

Все!

Я пытаюсь найти более быстрый метод вычисления суммы MD5 большого набора файлов, чтобы идентифицировать дубликаты для личных целей.

Я используя Timothy Macintha fast ha sh реализацию ( здесь ), чтобы выполнить работу.

Я пробовал три разных подхода при применении суммы md5 к каждому файлу: перебор набора с использованием потока и с использованием parallelStream.

Что я обнаружил, так это то, что на небольшом наборе с большими файлами параллельный подход превосходит два других по большому и дальнему.

Но, если набор очень большие с небольшими файлами, обычный и потоковый подходы намного быстрее.

Результаты (в миллисекундах на файл для каждого подхода) можно увидеть ниже: inof

Есть ли причина изменения производительности для параллельного подхода?

Может ли сохранение сумм md5 в новом наборе отрицательно повлиять на любой из перечисленных подходов?

Код I «м Для трех подходов используются следующие:

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

1 Ответ

0 голосов
/ 19 января 2020

Я посмотрел исходный код упомянутой вами библиотеки MD5, насколько я понимаю, MD5.getHa sh использует операцию блокировки из старого io api (FilterInputStream), что приводит к плохой производительности, в то время как работа с параллельными потоками.

Для лучшего понимания загляните в раздел «Блокирующий или неблокирующий ввод-вывод» в https://dzone.com/articles/java-nio-vs-io

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...