我正在使用 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/