并行部分任务的 Java 并发模式

标签 java design-patterns concurrency

我当然是在一个线程中从文件中读取行。行按键排序。

然后我收集具有相同键的行(15-20 行),进行解析、大计算等,并将结果对象推送到统计类。

我想并行我的程序在一个线程中读取,在多个线程中进行解析和计算,并在一个线程中加入结果以写入统计类。

java7框架中是否有针对此问题的现成模式或解决方案?

我用多线程执行器实现了它,推送到阻塞队列,并在另一个线程中读取队列,但我认为我的代码很糟糕并且会产生错误

非常感谢

更新:

我无法映射内存中的所有文件 - 它非常大

最佳答案

您已经想到了主要的方法类别。 CountDownLatch、Thread.join、Executors、Fork/Join。另一种选择是 Akka 框架,它的消息传递开销为 1-2 微秒,并且是开源的。但是,让我分享另一种方法,该方法通常比上述方法更简单,这种方法源于为许多公司使用 Java 处理批处理文件加载。

假设您将工作分解的目标是表现,而不是学习。以从开始到结束所花费的时间来衡量的性能。然后,通常很难使其比内存映射文件和在固定到单个内核的单个线程中处理更快。它还提供了更简单的代码。双赢。

这可能有违直觉,但是处理文件的速度几乎总是受到文件加载效率的限制。不是处理的并行程度。因此,内存映射文件是一个巨大的胜利。内存映射后,我们希望算法在执行文件加载时与硬件的争用较少。现代硬件倾向于将 IO Controller 和内存 Controller 与 CPU 放在同一个插槽上;当与 CPU 本身内的预取器结合使用时,当从单个线程以有序方式处理文件时,它会带来非常高的效率。这可能非常极端,以至于并行实际上可能要慢得多。将线程固定到内核通常会使内存绑定(bind)算法的速度提高 5 倍。这就是内存映射部分如此重要的原因。

如果您还没有,请尝试一下。

关于并行部分任务的 Java 并发模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15431931/

相关文章:

java - 为什么 uDig 的渲染 map 看起来比我的好很多

java - 如何将日期时间从一个时区转换为另一个时区

Java API 用于获取一年中特定时区夏令时的开始和结束详细信息

java.sql.SQLException:索引处缺少 IN 或 OUT 参数::1

java - 有没有办法在给定条件的情况下仅使用递归类型绑定(bind)字段?

"internal"列表的 Pythonic 访问器/修改器

asp.net-mvc-2 - Web 应用程序 : Allowing super users to impersonate other users - Is there a design pattern for this?

concurrency - 如何理解自旋锁的这些实现?

javascript - jQuery触发函数是否保证同步

mongodb - MongoDB将写锁定到什么级别? (或:“每个连接”是什么意思