JCIFS:文件检索太慢而无法使用

时间:2012-05-10 12:08:39

标签: java samba jcifs windows-share

我只是测试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共享

7 个答案:

答案 0 :(得分:18)

我发现某处SmbFileInputStream没有自己的缓冲,因此是缓慢的原因。在BufferedInputStream中包装SmbFileInputStream解决了这个问题。

 SmbFile sFile = new SmbFile(path, authentication);

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

答案 1 :(得分:17)

就我个人而言,通过JCIFS将文件推送到Windows共享的速度太慢而无法使用。

解决方案原来是定义属性

-Djcifs.resolveOrder=DNS

BCAST的default inclusion - 向255.255.255.255广播NetBIOS名称查询 - 不必要地导致延迟很长时间。 (上面的链接来自top-level API docs。)

答案 2 :(得分:4)

我注意到jCIFS做了什么"" (对于它读取的每个块,afair jcifs.smb.SmbTransport.checkStatus(..)) - 即对于读入缓冲区的每个块。这意味着使用BufferedInputStream可能真的加快速度,但真正的问题仍然存在。它只是没有&# 39; t经常发生,因此对整体时间的影响较小。

设置" jcifs.util.loglevel = 3 "有很多帮助。并看看真正的错误!

在我的情况下,我必须最后设置"jcifs.smb.client.dfs.disabled=false",因为"jcifs.resolveOrder=DNS"没有帮助..

答案 3 :(得分:2)

如果您可以依赖“其他东西”将共享作为本地目录挂载,那么在Java中读取已挂载共享中的文件应该是可移植的。

即使这不是一个真正的解决方案,也值得尝试一下,看看你是否获得更快的读取率。读取速度显着提高可能会改变您对可移植性相对重要性的看法。如果你没有获得显着的加速,那么你就会知道JCIFS不应该受到责备......

答案 4 :(得分:1)

即使有了现有的建议,我仍然发现JCIFS太慢,无法通过本地网络流式传输视频。这似乎与从网络读取的每个缓冲区的开销有关,甚至读入大缓冲区JCIFS本身具有有限的缓冲区大小,这是问题。

如果查看https://jcifs.samba.org/src/patches/,则会有一个补丁,即LargeReadWrite.patch。你需要应用补丁并重建代码才能使用它,但它对我来说有很大的不同。

答案 5 :(得分:1)

@ Xolve0添加的解决方案也适用于我。尝试写入文件时,SmbFileInput中的缓冲区问题也存在。我使用相同的BufferedInputStream(new SmbFileInputStream(sFile))使纯文本文件的执行时间从90秒减少到不到1秒。

识别此特定问题的快捷方法是跟踪打开JCIFS路径与写入文件本身之间的时间。

答案 6 :(得分:0)

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

以我为例,我能够跟踪jcifs使用In [15]: l = [ ...: [1, 2, 3, 4], ...: [2, 4], ...: [3, 3, 3] ...: ] In [16]: list(zip_longest(*l, fillvalue=0)) Out[16]: [(1, 2, 3), (2, 4, 3), (3, 0, 3), (4, 0, 0)] In [17]: [sum(column)/len(l) for column in zip_longest(*l, fillvalue=0)] Out[17]: [2.0, 3.0, 2.0, 1.3333333333333333] 繁重的速度,如果SecureRandom报告的熵不足,则阻塞了。

安装/dev/random并配置并启用rng-tools使性能达到可接受的水平。

您可以使用以下命令check the available entropy(至少在RHEL上):

rngd