Java AsynchronousFileChannel在Linux中有许多打开的文件处理程序

时间:2011-10-23 13:13:46

标签: java linux

我对asynch文件I / O的理解可能有误,但我正在尝试使用最新的JDK 7的AsynchronousFileChannel来加速应用程序,导致意外的更糟糕的结果。应用程序在我进行更改之前使用了与PrintWriter的同步模式,如下所示:

    if( asynchMode ){
        AsynchronousFileChannel writer = AsynchronousFileChannel.open(Paths.get(outputFileName),
        StandardOpenOption.WRITE, StandardOpenOption.CREATE);       
        ((AsynchronousFileChannel)writer).write(ByteBuffer.wrap(builder.toString().getBytes()), 0);
    else{
        PrintWriter writer = null;
        try{
            writer = new PrintWriter(new BufferedWriter(new FileWriter(
            outputFileName)));
            ((PrintWriter)writer).write(builder.toString());
        }
        finally{
            if( null!=writer )
                writer.close();
        }
    }

上面的代码存在于自己的类中。变量asynchMode允许我改变程序的行为。由于应用程序编写了很多真正无需进一步验证的文件,我宁愿不让CPU空闲而线程在写入文件时等待。以上是基于我对asynch文件I / O的理解,我承认可能在错误的基础上。

除了较差的表现之外,一个奇怪的事情是当我做ls -l /proc/p时有很多文件描述符。 感谢您的任何澄清和帮助!

1 个答案:

答案 0 :(得分:1)

在第一个示例中,在第二种情况下,不要关闭文件。

我会确保你只测试你感兴趣的东西。否则它可能是添加getByte()你只在第一种情况下做的是延迟的原因。我建议你在启动计时器之前先用字节[]开始,在这两种情况下都是为了比较。

注意:如果您使用缓冲流/写入器有一个数据/文本块,则最多只增加开销。

在编写真实文件时,将数据写入磁盘是瓶颈。您的系统可以以许多GB / s的速度复制数据,但大多数旋转磁盘只能维持50-100 MB / s的写入速度。因此,在Java中稍微提高效率可能无法为您提供所需的结果。