【问题标题】:Extremely slow file listing using Java + SAMBA + Win 7使用 Java + SAMBA + Win 7 列出非常慢的文件
【发布时间】:2013-02-19 17:40:08
【问题描述】:

我发现从 Win 7 客户端通过 SAMBA 文件夹调用 Java 的 File.listFiles() 非常慢,实际上比从 Mac 客户端慢了近 100 倍。 (两个客户端都运行 Java 7)。两个客户端自然都在同一个 1GB LAN 上。一位客户从他的 Win XP 客户端进行了测试,并获得了比他的 Win7 客户端更好的性能。有谁知道如何解决这个问题?

一些测试数据,包括时序: 列出 SAMBA(“QNAP”NAS 磁盘)上的 31 个文件夹:

赢 7:

列出\\nas\Public\David\Remote Stocks:0.0s 列出 \\nas\Public\David\Remote Stocks\Animals: 0.093s 列出 \\nas\Public\David\Remote Stocks\Animals\.jalbum: 0.312s 列出 \\nas\Public\David\Remote Stocks\Animals\.jalbum\thumbs: 0.405s 列出 \\nas\Public\David\Remote Stocks\album: 1.248s 列出 \\nas\Public\David\Remote Stocks\album\Animals:1.31 秒 列出 \\nas\Public\David\Remote Stocks\album\Animals\thumbs: 1.388s 列出\\nas\Public\David\Remote Stocks\album\Animals\slides:1.762s 列出 \\nas\Public\David\Remote Stocks\album\Animals\res: 2.542s 列出\\nas\Public\David\Remote Stocks\album\Sports:2.761s 列出 \\nas\Public\David\Remote Stocks\album\Sports\thumbs:2.839s 列出\\nas\Public\David\Remote Stocks\album\Sports\slides:3.229s 列出 \\nas\Public\David\Remote Stocks\album\Sports\res: 3.978s 列出 \\nas\Public\David\Remote Stocks\album\res: 4.196s 列出\\nas\Public\David\Remote Stocks\album\Scenic:4.695s 列出 \\nas\Public\David\Remote Stocks\album\Scenic\thumbs: 4.773s 列出\\nas\Public\David\Remote Stocks\album\Scenic\slides:5.194s 列出 \\nas\Public\David\Remote Stocks\album\Scenic\res: 5.99s 列出 \\nas\Public\David\Remote Stocks\album\People: 6.208s 列出 \\nas\Public\David\Remote Stocks\album\People\thumbs: 6.302s 列出\\nas\Public\David\Remote Stocks\album\People\slides:6.692s 列出 \\nas\Public\David\Remote Stocks\album\People\res: 7.472s 列出 \\nas\Public\David\Remote Stocks\.jalbum: 7.659s 列出\\nas\Public\David\Remote Stocks\Sports:7.768s 列出 \\nas\Public\David\Remote Stocks\Sports\.jalbum:7.909s 列出 \\nas\Public\David\Remote Stocks\Sports\.jalbum\thumbs: 7.987s 列出\\nas\Public\David\Remote Stocks\Scenic:8.486s 列出 \\nas\Public\David\Remote Stocks\Scenic\.jalbum:8.642s 列出\\nas\Public\David\Remote Stocks\Scenic\.jalbum\thumbs:8.72s 列出\\nas\Public\David\Remote Stocks\People:9.282s 列出 \\nas\Public\David\Remote Stocks\People\.jalbum:9.422s

Mac 上的相同列表:

上市/Volumes/Public/David/Remote Stocks: 0.0s 上市/Volumes/Public/David/Remote Stocks/Animals: 0.013s 上市/Volumes/Public/David/Remote Stocks/Animals/.jalbum:0.018s 上市/Volumes/Public/David/Remote Stocks/Animals/.jalbum/thumbs:0.022s 上市/Volumes/Public/David/Remote Stocks/专辑:0.027s 上市/Volumes/Public/David/Remote Stocks/album/Animals: 0.03s 上市/Volumes/Public/David/Remote Stocks/album/Animals/thumbs: 0.032s 上市/Volumes/Public/David/Remote Stocks/album/Animals/slides: 0.034s 上市/Volumes/Public/David/Remote Stocks/album/Animals/res: 0.038s 上市/Volumes/Public/David/Remote Stocks/album/Sports:0.04s 上市/Volumes/Public/David/Remote Stocks/album/Sports/thumbs: 0.042s 上市/Volumes/Public/David/Remote Stocks/album/Sports/slides:0.046s 上市/Volumes/Public/David/Remote Stocks/album/Sports/res: 0.05s 上市/Volumes/Public/David/Remote Stocks/album/res: 0.052s 上市/Volumes/Public/David/Remote Stocks/专辑/Scenic:0.058s 上市/Volumes/Public/David/Remote Stocks/专辑/Scenic/thumbs: 0.064s 上市/Volumes/Public/David/Remote Stocks/专辑/Scenic/slides:0.068s 上市/Volumes/Public/David/Remote Stocks/album/Scenic/res: 0.074s 上市/Volumes/Public/David/Remote Stocks/专辑/人物:0.08s 上市/Volumes/Public/David/Remote Stocks/album/People/thumbs: 0.082s 上市/Volumes/Public/David/Remote Stocks/专辑/人物/幻灯片:0.085s 上市/Volumes/Public/David/Remote Stocks/album/People/res: 0.089s 上市/Volumes/Public/David/Remote Stocks/.jalbum:0.091s 上市/Volumes/Public/David/Remote Stocks/Sports:0.103s 上市/Volumes/Public/David/Remote Stocks/Sports/.jalbum:0.106s 上市/Volumes/Public/David/Remote Stocks/Sports/.jalbum/thumbs:0.108s 上市/Volumes/Public/David/Remote Stocks/Scenic:0.11s 上市/Volumes/Public/David/Remote Stocks/Scenic/.jalbum:0.122s 上市/Volumes/Public/David/Remote Stocks/Scenic/.jalbum/thumbs:0.124s 上市/Volumes/Public/David/Remote Stocks/People: 0.126s 上市/Volumes/Public/David/Remote Stocks/People/.jalbum:0.133s

我终于尝试在 Windows 上执行多线程列表来克服网络延迟效应。它有所帮助,从 9 秒到 3 秒,即快了 3 倍,但性能仍然比我的 MacBook Pro 客户端测得的 0.133 秒慢得多。

【问题讨论】:

  • 你有sn-p代码吗?调用File.listFiles() 只会返回一个数组,所以之后你要循环遍历数组并打印名称?还有什么?编辑:除非这些日志来自您的 NAS...?
  • 你可以试试Files.newDirectoryStream。它的主要优点是它可以增量列出文件而不必先列出整个目录,但它可能表现得更好。

标签: java performance networking samba


【解决方案1】:

使用Files.walkFileTree API 解决了问题。有了它,我可以通过一次 SAMBA 网络 IO 调用获取文件夹中所有文件的所有属性。

【讨论】:

    【解决方案2】:

    我认为您偶然发现了一个已知的 Windows 问题。

    也许这篇文章可以帮到你:http://www.sysprobs.com/windows-7-network-slow

    编辑:

    如果您确定您的问题不是由于操作系统在连接到旧 SMB 协议公开的共享时的不良行为,那么它是(并非闻所未闻的)缓慢归因于 JDK 实现。

    OpenJDK 和 Oracle Java 的java.io.File.listFiles() 委托给(未公开的)抽象类java.io.FileSystemString [] list() 方法,而java.io.UnixFileSystemjava.io.Win32FileSystemjava.io.WinNTFileSystem 又以特定于平台的方式实现。

    他们的list() 函数始终是native,所以我认为缓慢是由于JRE 附带的DLL 实现造成的。

    我们之前在 Windows XP 中遇到过关于文件浏览的类似问题。很长一段时间以来,它都是 JRE 的一个突出错误。

    【讨论】:

    • 我不这么认为。在此处发布之前,我实际上遵循了该文章中除第 5 步(“禁用无线网络和任何其他(包括虚拟适配器)网络适配器。”)之外的所有内容。我正在测试的 Win 7 PC 连接了以太网电缆
    • 编辑了回复。如果浏览协议不是问题,则可能是 JRE 问题。
    猜你喜欢
    • 1970-01-01
    • 2017-07-23
    • 2013-03-04
    • 2012-03-08
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多