首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有大量打开文件处理程序的Java AsynchronousFileChannel

带有大量打开文件处理程序的Java AsynchronousFileChannel
EN

Stack Overflow用户
提问于 2011-10-23 21:13:46
回答 1查看 786关注 0票数 0

我对异步文件I/O的理解可能是错误的,但我正在尝试使用最新的JDK7的AsynchronousFileChannel来加速应用程序,结果却出乎意料地糟糕。在我进行如下更改之前,应用程序正在使用PrintWriter的同步模式:

代码语言:javascript
复制
    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时,有很多文件描述符。感谢您的任何澄清和帮助!

EN

回答 1

Stack Overflow用户

发布于 2011-10-23 21:21:24

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

我会确保你只测试你感兴趣的东西。否则,添加getByte()可能是延迟的原因,您只在第一种情况下才这样做。我建议你在启动计时器之前先从byte[]开始,这两种情况下都是相似的,以便进行相似的比较。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7866343

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档