java - 磁盘读取操作执行速度非常慢 | Java流

标签 java performance java-8 java-stream filestream

我需要从文件夹中读取图像并为它们生成校验和。大约有330760张图像。代码如下:

package com.test;

import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

import org.apache.commons.codec.digest.DigestUtils;

public class FileTest2 {

    private void readFiles() throws IOException {
        try (Stream<Path> filePathStream = Files
                .walk(Paths.get("d:\\codebase\\images"))) {
            filePathStream.parallel().forEach(filePath -> {
                String checksumSHA256 = "";
                try {
                    checksumSHA256 = DigestUtils.sha384Hex(new FileInputStream(filePath.toString()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
                if (Files.isRegularFile(filePath)) {
                    System.out.println(checksumSHA256);
                    System.out.println(filePath);
                    System.out.println("\n");

                }
            });
        }
    }

    public static void main(String[] args) throws IOException {
        long startTime = System.currentTimeMillis();
        FileTest2 fileTest = new FileTest2();
        fileTest.readFiles();
        long endTime = System.currentTimeMillis();
        System.out.println("Total Time took: " + (endTime - startTime) / 1000);
    }
}

大约花了36分钟。

系统配置:

核心:8
内存:32 GB(15-17 GB 可用)。其余内存正被另一台服务器使用。

36 分钟太多了。有没有办法提高性能?

最佳答案

正如其他人指出的那样,您不会终止执行程序。要查看实际时间,请运行以下命令

public static void main(String[] args) throws Exception {
    long startTime = System.currentTimeMillis();

    FileTest fileTest = new FileTest();
    fileTest.readFiles();

    long endTime = System.currentTimeMillis();
    System.out.println("Total Time took: "+ (endTime-startTime)/1000);
}

注意:至少从您发布的代码来看,没有理由使用 ExecutorService

关于java - 磁盘读取操作执行速度非常慢 | Java流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52841921/

相关文章:

list - 在模式中重用列表

html - 编写高效的 CSS

java - 在stream和noneMatch方面遇到了一些真正的麻烦

java - 使用 Spinner 从 assets 文件夹中访问文件

java - 如何在黑莓屏幕上渲染网页内容?

java - JNK导出函数调用

Java 8 List to EnumMap with sums

java - Map<String, List<String>> 如果键与字符串形式相同,则在运行时将值添加到列表中

angularjs - Angular JS 单页应用程序中的神秘内存泄漏

java - Maven: fatal error 编译:无效的目标版本:1.8