Как увеличить скорость генерации md5 из нескольких файлов? - PullRequest
0 голосов
/ 03 мая 2019

У меня есть от 10000 до 12000 файлов изображений, и во внешнем хранилище присутствует пространство до 800 МБ.

Я использую цикл, который берет каждый путь к файлу и генерирует 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.

И сделает ли обтекание потока буфера во входном потоке быстрее?

1 Ответ

0 голосов
/ 03 мая 2019

Как и в случае любых проблем с оптимизацией, вы должны измерить свою производительность, чтобы узнать, влияют ли какие-либо внесенные вами изменения.

2k - это, конечно, небольшой размер буфера, а больший может работать лучше.Но у стеков ввода-вывода есть буферы, поэтому они могут оказать незначительное влияние.Попробуйте сами измерить.

Еще одна оптимизация, на которую стоит обратить внимание, это заметить, что чтение файла является операцией, связанной с вводом / выводом, а вычисление MD5 связано с ЦП.Пусть один поток читает содержимое файла, а другой поток просто обновляет состояние MD5.В зависимости от количества ядер ЦП на вашем устройстве вы можете хэшировать несколько файлов параллельно с повышением производительности.

...