Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I/O消耗更多的CPU资源_Java_Io - Fatal编程技术网

Java I/O消耗更多的CPU资源

Java I/O消耗更多的CPU资源,java,io,Java,Io,我正在尝试使用FileOutputStream/BufferedOutputStream创建100个文件。 我可以看到CPU利用率为100%,持续5到10秒。我正在写的目录是空的。我正在通过iText创建PDF文件。每个文件大约有1 MB。我在Linux上运行 我如何重写代码,以便将CPU利用率降至最低?这是在一个已经包含大量文件的目录中吗?如果是这样的话,您很可能只是看到了在一个目录中有大量文件的惩罚——这因操作系统和文件系统而异 否则,在创建文件时,您实际上在做什么?数据来自哪里?它们是大文

我正在尝试使用FileOutputStream/BufferedOutputStream创建100个文件。
我可以看到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有很多不同之处