java - 随着线程数的增加,向 HDD 写入文件变得更慢

标签 java multithreading

我正在使用 ExecutorService 创建一个多线程环境。我的所有线程都在做同样的事情。 他们从 DB 获取数据,使用 itext 准备 PDF 并在 D 驱动器中的某个位置写入 PDF。 但我注意到一个奇怪的事情。当我增加线程数量时,我的端到端进程变得更慢。 对于 1 个线程 - 1 小时内生成 4000 个 pdf 对于 2 个线程 - 1 小时内生成 3500 个 pdf 对于 3 个线程 - 1 小时内生成 3200 个 pdf 对于 4 个线程 - 1 小时内生成 3000 个 pdf

使用logger,可以明显看出,从DB获取数据非常快,瓶颈是PDF写入操作。

我在某个地方读到,在 Windows 中,与顺序写入相比,同时在同一目录中写入多个文件会变得更慢。 如果属实,我还可以实现哪些其他逻辑来获得更高的性能。 谢谢。

环境详细信息

操作系统 - Windows 7,32 位 内存 - 3 GB 处理器 - 酷睿 i3 JDK-1.6 数据库-PostgreSql 9.3 PDF 的大小 - 在 500KB 到 2 MB 之间变化

最佳答案

HDD 一次只能写入磁盘的一部分,因此如果有多个不同的线程(甚至进程)同时写入,则磁盘必须到处移动其磁头,写入一个这里的一点到文件 A,那里的一点到文件 B,等等。这就是为什么将此任务拆分为线程实际上更慢的原因,您使 HDD 工作更加困难。

如果您有任何 CPU 密集型任务,它们通常可以在几个线程之间多路复用,以便在任何现代 CPU 上获得优势,但是一旦您处理像特定 HDD 这样的单例资源,您就通常,对于您正在做的事情的这方面,坚持使用单个线程会更好。

关于java - 随着线程数的增加,向 HDD 写入文件变得更慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27480314/

相关文章:

java - 热交换代理 : How to use it for classes inside WAR files?

java - 卡夫卡流延迟启动消费者优雅关闭的重新平衡

java - Java 中如何杀死一个线程?

c# - 为什么 Thread.Join() 挂起,即使线程中的方法已经返回?

c++ - 如何在 C++ 中添加异步等待?

java - 为什么 java.sql.ResultSet 的 "getFloat(column)"方法不返回任何东西,而其他方法返回任何东西?

java - LinkedHashMap : first key is becomes last

c++ - 有没有办法查看哪个线程正在使用 gdb 打印到 stdout 或 stderr?

java - 采访: Remove Loop in linked list - Java

c# - 无限while循环问题