【问题标题】:Java Recursive File Copy optimizationJava 递归文件复制优化
【发布时间】:2014-03-17 20:33:32
【问题描述】:

我有一个将 PDF 文件(子文件夹)复制到目标文件夹的小应用程序。但是它的工作速度很慢,我想对其进行优化。你能帮帮我吗?

代码:

    public void pdfFolderCopy(File src, File dest)
            throws IOException {
        if (src.isDirectory()) {
            if (!dest.exists()) {
                dest.mkdir();
            }
            String files[] = src.list();
            for (String file : files) {
                File srcFile = new File(src, file);
                File destFile = new File(dest, file);
                pdfFolderCopy(srcFile, destFile);
            }
        } else {
            if (!dest.exists()) {
                System.out.println("Copying: " + src);
                //Use the Apache IO copyFile method:
                FileUtils.copyFile(src, dest);
            }
        }
    }

如果每个文件都已经存在,它会运行大约一分半钟。如果我们需要复制大约 500 个文件,大约需要 5 分钟。

【问题讨论】:

  • 看不出为什么会这么慢。尝试记录几次
  • 我认为这也取决于文件的大小。它们有多大??
  • 大约有 15.000 个文件,平均 100K 个文件zie。
  • 也许多线程复制可以更快地工作。例如,前四个根文件夹可以由四个线程处理。我不知道 File 对象是否可以用于不同的文件,但它可以更快,而无需为每个文件重新创建。检查最大的文件,为其创建一个对象,为所有人重新使用它(我不确定这是否会删除硬盘中的所有内容,所以你应该小心)
  • @huseyintugrulbuyukisik:多线程可能是个好主意,但重用File 是无稽之谈。 File 是一个廉价的对象,有点像包装的 String 并且它是不可变的。创建数千个可能需要几毫秒。

标签: java file pdf optimization copy


【解决方案1】:

您的代码中唯一真正耗时的任务是FileUtils.copyFile()。所需时间将根据要复制的文件数量和大小而增加。

关于您的代码,我建议提取对dest 目录的检查,因为它在复制过程中不应更改。在启动pdfFolderCopy 之前检查并创建dest 目录。

【讨论】:

  • 你的最后一段对我来说毫无意义。测试dest.exists() 将测试目录是否存在并且不会复制任何内容。
【解决方案2】:

我会尝试简单地调用一个过程

/bin/cp -R -n src dest

其中-R 表示递归,-n 表示不覆盖。操作系统很有可能比您更快地做到这一点。不知道 Windows 或其他操作系统的相应命令是什么。

为此你只需要

new ProcessBuilder()
.command("/bin/cp", "-R", "-n", src.toString(), dest.toString())
.start();

如果你想用 Java 来做,我会尝试一些小的改动:

  • dest.mkdir() 无需任何检查即可工作,可能会更快
  • listFiles 可能比手动编写它们更快(可能不相关)
  • 一旦您自己创建了dest 文件夹,您就无需检查那里是否有任何预先存在的文件

我猜,多线程可能会带来不错的加速:让主线程创建复制作业并将它们提交给某个执行器(大约有 4-8 个线程)。

请注意,这种多线程写入可能会导致更高的磁盘碎片,但我不在乎。如果必须,我会改为创建文件编辑作业,让它们返回文件内容(n * 100 KB 什么都不是),并使用单个编写器线程。

【讨论】:

    猜你喜欢
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 2021-03-28
    • 1970-01-01
    • 2012-08-11
    相关资源
    最近更新 更多