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

标签 java linux

我对异步文件 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 空闲和线程等待。以上是基于我对异步文件 I/O 的理解,我承认这可能是错误的。

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

最佳答案

在第一个例子中,你没有关闭文件,在第二个例子中你关闭了。

我会确保您只测试您感兴趣的东西。否则可能是因为添加您只在第一种情况下执行的 getByte() 是造成延迟的原因。我建议您在两种情况下启动计时器之前先使用 byte[] 来进行类似比较。

注意:如果您有一个使用缓冲流/写入器的数据/文本 block ,充其量只会增加开销。

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

关于Java AsynchronousFileChannel 在 Linux 中有很多打开的文件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7866343/

相关文章:

linux - 无法使用 hikey_defconfig 编译 u-boot

java - 如何创建对象的 OOP 基础知识

java - MainAcitivity 即使是 SingleTask 也不会进入 onNewIntent 方法并再次调用 onCreate

Java对象序列化,无法关闭ObjectOutputStream?

linux - 什么是./在终端上执行期间

linux - LVS LocalNode 无法在内核 4.1.6 上运行

java - 如何编写不等于特定枚举值的匹配器?

java - 使用改造获取带有 GSON 的嵌套 JSON 对象

linux - JRE (sun 1.6 21) 在 Linux Debian 5 上因 SIGBUS 而崩溃

linux - 删除文件中模式之间所有出现的某些字符