JCIFS:文件检索速度太慢是可用(JCIFS: file retrieval is too slo

2019-06-24 07:55发布

我只是在考验JCIFS访问Windows共享。 这是被完全无法使用的地步很慢。

import jcifs.smb.*;

class First {
    public static void main(String[] args) throws Exception {
    try {
        //jcifs.Config.setProperty( "jcifs.netbios.wins", "192.168.1.220" );
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication("domain.com", "Administrator", "password");

        SmbFile f = new SmbFile("smb://10.17.15.12/Share/xml/file.xml", auth);
        SmbFileInputStream in = new SmbFileInputStream(f);
        byte[] b = new byte[8192];
        int n;
        while(( n = in.read( b )) > 0 ) {
        System.out.write( b, 0, n );
        }
    } catch (SmbException smbe) {
        System.err.println(smbe.getNtStatus());
        System.err.println(smbe.toString());
        System.err.println(smbe.getCause());
    }
    }
}

这需要很长的时间初始输出来和后续读取也很缓慢。 任何想法如何使用它呢? 由此我可以写Java代码来访问Windows共享在便携方式任何替代也欢迎

Answer 1:

我发现某处SmbFileInputStream没有做自己的缓冲,从而为正在缓慢的原因。 包装SmbFileInputStream在的BufferedInputStream解决了这个问题。

 SmbFile sFile = new SmbFile(path, authentication);

 BufferedInputStream buf = new BufferedInputStream(new SmbFileInputStream(sFile));


Answer 2:

就我自己来说,推文件通过JCIFS Windows共享是成为可用的速度太慢。

将溶液竟然是定义属性

-Djcifs.resolveOrder=DNS

该默认包含 BCAST的-广播NetBIOS名称查询到255.255.255.255 -被不必要地导致长的延迟。 (以上链接从去成帧顶层API文档 。)



Answer 3:

我注意到的是,JCIFS做“东西”(AFAIR jcifs.smb.SmbTransport.checkStatus(..))每读取块-即对于被读入缓冲区每个块。 这意味着使用BufferedInputStream可能真正加快速度,但真正的问题依然存在。 它不仅不会像以前那样经常发生,因此对整个时间较低的影响..

它帮助了很多设置“jcifs.util.loglevel = 3”,看看什么是真的错了!

在我来说,我必须设置"jcifs.smb.client.dfs.disabled=false"到底,为"jcifs.resolveOrder=DNS"没有帮助..



Answer 4:

如果你能靠“别的东西”装入共享作为本地目录你,然后阅读在Java中安装共享文件应该是便携式的。

即使这不是一个真正的解决方案,这将是值得尝试这个,看看如果你得到一个更快的读取速度。 一个显著更快的读取速度可能会改变对便携性的相对重要性你的头脑。 如果你没有得到显著加速,那么你就会知道,JCIFS不怪?



Answer 5:

即使与现有的建议,我还是发现流的视频在我的本地网络JCIFS太慢。 这似乎是做每个缓冲区从网络读取的开销,甚至是读入大容量缓存JCIFS本身有这是问题的一个有限的缓冲区大小。

如果你在看https://jcifs.samba.org/src/patches/有一个补丁,LargeReadWrite.patch。 你需要打补丁,并重新生成代码来使用它,但它做了一个很大的区别我。



Answer 6:

通过@ Xolve0添加的解决方案为我为好。 在缓冲区问题SmbFileInput试图写文件时也存在。 我用同样BufferedInputStream(new SmbFileInputStream(sFile))以使从90secs时间执行降低到小于1秒的纯文本文件。

一个快速的方法来识别这个具体问题将跟踪的打开之间的时间JCIFS路径和文件本身的写操作。



Answer 7:

我知道这是一个老问题,但对于其他人谁已经尝试其他的解决方案无济于事:

就我而言,我是能够跟踪放缓JCIFS' 大量使用SecureRandom ,这要是块/dev/random报告熵不足。

安装rng-tools和配置并启用rngd带来性能提升到可接受的水平。

您可以检查可用的熵 (RHEL上至少)用下面的命令:

cat /proc/sys/kernel/random/entropy_avail


文章来源: JCIFS: file retrieval is too slow to be usable