我有一个线程池有10个线程和大量的文本数据处理,我正在并行运行这些线程,我无法利用核心i7博锐处理器的完整cpu resorce,有人帮我解决这个问题。我想要最大的CPU利用率。四核处理器运行超过8个线程
回答
大多数情况下,您的开销可能比CPU利用率更高。
- 这可能是因为读取文件并将其分解为句子需要时间。由于你没有看到100%的CPU,这是我的猜测。
- 向其他线程启动和添加任务的开销大于每个任务的工作量。您预计接近100%的CPU使用率,但速度远远低于您的预期。它甚至可能比使用一个线程慢。
除非您的JVM预热,否则您可能会发现这比使用多线程更有用。 (100个句子文件将不够接近)
我甚至有500个句子文件,同样的情况也是如此,整个过程涉及到将文本翻译成6种不同的语言 –
在这种情况下,我会翻译一种语言每个线程,一个线程读取到句子。这应该是CPU密集型的。我假设你正在使用Java进行翻译而不使用任何外部资源或服务。 –
如果每个线程也应该从文件中读取句子并处理它,那么我怀疑磁盘在这种情况下是瓶颈。从单个磁盘进行并行读取通常会导致单次顺序读取性能下降。
在我看来,你应该把所有东西都留给一个线程,或者至少使用一个生产者 - 多个消费者模式来串行化阅读和并行处理句子处理。
在许多情况下,不是在每个执行单独作业的线程中执行相同的操作,而是使用同步的队列进行通信,以获得更好的结果。尝试拆分应用程序,以便所有读操作都是从单个线程完成的,然后将数据提供给工作线程进行处理,而另一个线程进行后处理(如果有)。你可能会发现这种模型使用更多的处理能力,并且工作速度明显加快。
多线程会带来一些开销,从细分作业中的任务,将作业提交到作业队列,然后让ThreadPoolExecutor
执行作业,可能在完成时组合结果。即使没有因磁盘访问或其他共享资源而引起的争用,我发现将作业细分为小于1毫秒也不值得。在具有多个套接字的大型机器上运行时,由于缓存一致性开销增加,该阈值甚至更高。
- 1. 同时处理超过64个线程
- 2. 在处理器内核上如何执行多个线程
- 3. 多核处理器上的多线程
- 4. 多核处理器的多线程
- 5. 多核心处理器中的线程
- 6. PBS(扭矩)不考虑四核处理器作为4个处理器
- 7. 四核处理器的笔记本电脑中的Java多线程
- 8. 只能在一个处理器上进行运行只能在其他处理器上运行线程吗?
- 9. 为什么单个线程进程在多个处理器/内核上执行?
- 10. 线程运行中的处理程序
- 11. 具有单核处理器和多核处理器的单线程代码的多线程代码
- 12. 多核处理器上当前正在运行的线程是什么?
- 13. Java多线程 - 分配线程到处理器核心
- 14. 处理器中每个内核的线程数
- 15. 在单核机器上运行3个并行线程
- 16. 产生在四核处理器上构建内核的多个作业?
- 17. 四核上的Linux:单个可执行文件,四个进程
- 18. 哪个线程做backgroundworker完成事件处理程序运行?
- 19. 使用单核的Android线程处理
- 20. 多核处理器中的多线程应用程序
- 21. 单对多线程的单核处理器的编程
- 22. 并行运行单元测试超过五个核心
- 23. 如何处理运行线程的定时器
- 24. 多处理线程池关闭,超时
- 25. 我怎样才能找到每个线程在哪个处理器上运行?
- 26. 我真的需要四核处理器来安装SharePoint 2010吗?
- 27. 在一个进程中创建的posix线程可以跨两个物理处理器并行运行吗?
- 28. 通过线程池处理器相关性和线程创建
- 29. Shell,运行四个并行进程
- 30. 并行处理N个线程? (更新)
有点代码会有助于回答这个问题。 –
为什么为什么为什么?一个100行字的文本文件不需要8个线程来处理。你在浪费资源和做傻事。 STAHP –
将100个句子翻译成6种不同的语言,并对文字执行字数统计操作 –