有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java文件。太慢了!

我正在做文件的递归复制,就像^{}我只想复制较新的文件目标文件(我不能直接使用xcopy,因为我需要在复制过程中更改一些文件)

在java中,我使用^{}检查目标文件是否比源文件旧,并且速度非常慢

  • 我可以加快这个过程吗(也许使用JNI
  • 是否有其他复制脚本可以更好地完成这项工作(复制新文件+regexp更改一些文本文件)

无论如何复制文件都不是一个选项,因为这比检查上次修改日期(通过网络复制)需要更多时间


共 (3) 个答案

  1. # 1 楼答案

    你需要确定它为什么这么慢

    运行程序时,进程的CPU利用率是多少。如果它超过50%的用户,那么你应该能够选择你的程序,如果它不到20%,你就没有那么多可以做的

    通常这种方法比较慢,因为您正在检查的文件位于磁盘上,而不是内存中。如果是这种情况,您需要加快访问磁盘的速度,或者使用更快的驱动器。e、 g.SSD的速度可以提高10-100倍

    批量查询可能会有所帮助。您可以使用多个线程来检查上次修改的日期。e、 g.有一个固定大小的线程池,并为每个文件添加一个任务。线程池的大小决定了一次轮询的文件数

    这允许操作系统重新排序请求,以适应磁盘上的布局。注意:理论上这很好,但你必须测试这是否会让你的操作系统/硬件运行得更快,因为它同样可能会让运行速度变慢

  2. # 2 楼答案

    我想你是在网络上做这件事的,否则复印件就没什么意义了。网络目录操作很慢,运气不好。您总是可以将文件复制到低于某个大小阈值的位置,以使整个操作花费的时间最少

    我不同意Kris的观点:Java做这件事的方式没有惊人的低效,而且在任何情况下,它真的必须这样做,因为你想要最新的价值

  3. # 3 楼答案

    不幸的是,Java处理查找lastModified的方式很慢(基本上,当您请求信息时,它会查询底层文件系统中的每个文件,没有在listFiles或类似文件上批量加载这些数据)

    您可能会调用一个更高效的本机程序来批量执行此操作,但任何此类解决方案都与您部署到的平台密切相关