从装载的网络驱动器复制Java文件比从OS filemanager复制慢

从装载的网络驱动器复制Java文件比从OS filemanager复制慢,java,nas,Java,Nas,以下是场景: 我们有一个NAS,其中包含需要复制到本地磁盘以加快处理速度的数据集。数据集的大小为2到15GB,每个数据集都位于NAS上自己的文件夹中 要复制到本地磁盘,我调用: FileUtils.copyDirectory(nasDir, localDiskDir); 其中两个参数是File实例。 nasDir是网络映射的SMB驱动器。使用Java复制数据集时,最高传输速度约为8MB/s。根据服务器的不同,使用Windows资源管理器或Nautilus的同一拷贝速度高达34-35MB/s持续

以下是场景: 我们有一个NAS,其中包含需要复制到本地磁盘以加快处理速度的数据集。数据集的大小为2到15GB,每个数据集都位于NAS上自己的文件夹中

要复制到本地磁盘,我调用:

FileUtils.copyDirectory(nasDir, localDiskDir);
其中两个参数是
File
实例。
nasDir
是网络映射的SMB驱动器。使用Java复制数据集时,最高传输速度约为8MB/s。根据服务器的不同,使用Windows资源管理器或Nautilus的同一拷贝速度高达34-35MB/s持续

有没有人知道为什么会这样,以及如何通过java更快地复制目录?即使我们比本机速度慢5-10%也是可以接受的,但当前的差异表明某个地方的性能显著下降


编辑:最初认为它可能与Apache Commons I/O库有关,但通过测试发现它在某种程度上是一个更基本的问题。

由于设置非常复杂,很难重现这一点。我简单地看了一下
copyDirectory
方法,但只能猜测是什么原因导致了给定设置中的低性能。在上有一个示例,即此示例:,它提供了类似于
FileUtils
的功能,但它是基于(现代)标准API构建的-这对您来说是如何执行的?@Marco13我在我们的一个数据集上运行了Copy类,将其从NAS本地复制到我的开发机器上,并以12MB/s的速度持续复制。Nautilus中完全相同的副本(相同的数据集,清理后相同的机器端点)以持续60MB/s的速度运行,因此问题似乎与Apache commons I/O无关,如果我弄清楚如何解决,将重命名问题。感谢Oracle API中指向测试类的指针。同样,如果没有可用的NAS,很难复制,但作为第一个诊断步骤,可能会有兴趣查看单个
文件.copy
或显示相同的性能问题-只是大致了解目录遍历是否有问题,或者复制实际内容。后者很难想象,因为这些方法通常在后台使用相当低级别的IO操作,但是。。。谁知道呢,所以我在我的模块中有一个不同的方面,我基本上遍历文件夹并扫描文件,将时间戳与内存中的时间戳进行比较,以确定数据集中的文件是否已更新,这显然符合预期。当我读取每个文件的头中的元数据时,我的性能会受到影响。。。我将查看数据集的本地文件副本是否也具有相同的速度性能。在单个大文件(0.6GB)上,使用
cp
复制需要12秒。使用
java复制
需要48秒。在本地文件系统上,我不确定它是否以明显不同的方式工作,因为
cp
调用需要1秒,
java复制需要2秒。这很容易归因于初始化时间。然而,据我所知,网络挂载路径使用的是相同的操作系统API。因此,java文件传输速率本身仍然明显较慢,而不是目录遍历,@Marco13