Java I/O消耗更多的CPU资源
我正在尝试使用FileOutputStream/BufferedOutputStream创建100个文件。Java I/O消耗更多的CPU资源,java,io,Java,Io,我正在尝试使用FileOutputStream/BufferedOutputStream创建100个文件。 我可以看到CPU利用率为100%,持续5到10秒。我正在写的目录是空的。我正在通过iText创建PDF文件。每个文件大约有1 MB。我在Linux上运行 我如何重写代码,以便将CPU利用率降至最低?这是在一个已经包含大量文件的目录中吗?如果是这样的话,您很可能只是看到了在一个目录中有大量文件的惩罚——这因操作系统和文件系统而异 否则,在创建文件时,您实际上在做什么?数据来自哪里?它们是大文
我可以看到CPU利用率为100%,持续5到10秒。我正在写的目录是空的。我正在通过iText创建PDF文件。每个文件大约有1 MB。我在Linux上运行
我如何重写代码,以便将CPU利用率降至最低?这是在一个已经包含大量文件的目录中吗?如果是这样的话,您很可能只是看到了在一个目录中有大量文件的惩罚——这因操作系统和文件系统而异
否则,在创建文件时,您实际上在做什么?数据来自哪里?它们是大文件吗?您可能希望做的一件事是尝试通过tearrayoutputstream写入
,这样您就可以看到有多少活动是由于文件系统引起的,有多少是由于您获取/写入数据的方式造成的。您不太可能减少任务的CPU负载,尤其是在Windows系统上。Linux上的Java确实支持异步文件I/O,但是,这会使代码严重复杂化。我怀疑您是在Windows上运行的,因为文件I/O在Windows上通常比在Linux上花费更多的时间。我甚至听说过在Windows上的linux虚拟机中运行Java的改进
在进程运行时查看任务管理器,并打开“显示内核时间”。用户空间中的CPU时间通常可以优化,但内核空间中的CPU时间通常只能通过进行更高效的调用来减少
- 更新-
专门解决异步、多路复用、分散/聚集文件IO的需要:
JSR-51引入的多路复用、非阻塞功能在很大程度上解决了网络套接字的问题,但在文件系统操作中却没有这样做
在JSR-203成为Java的一部分之前,您可以通过Linux上的项目获得真正的异步IO
Java NIO(1)允许您执行基于通道的I/O。这是性能上的改进,但您一次只执行数据缓冲区,而不是真正的异步和多路IO。这是一个很长的猜测,但即使您使用缓冲流,也要确保您一次不会写入一个字节
.read(int)
和.write(int)
方法是CPU杀手。您应该使用.read(byte[])
和.write(byte[],int,int)
。不要猜测:评测您的应用程序
如果数字显示大量时间花在写调用中,那么请考虑加快I/O速度的方法。但是如果大部分时间花在格式化输出内容(例如iText渲染)上,这就是你需要集中精力的地方。要编写的1MB文件足够大,可以使用java.nio
FileChannel,并且可以看到比java.io
更大的性能改进。重写你的代码,并根据旧的东西来衡量它。我预计至少会有2倍的改进。我认为这是操作系统本身设计的一部分。在ubuntu中你无法做到这一点,而在Windows中这是常见的情况,因为NTFS的设计和Windows的文件访问机制。Windows XP是为单用户操作系统量身定做的,他们并没有把太多的注意力放在“如果用户立即打开XXX文件会怎么样…”上。我认为windows 7Stu现在已经有所改进,请告诉我在规范中您看到了哪些关于异步IO的内容。我没有说Java不能在Windows上进行DMA。那完全是另一回事。我正在写的目录是空的。我正在通过iText创建PDF文件。每个文件大约有1 MB。我在Linux上运行。我发现使用ByteArrayOutputStream有很多不同之处