JSR 352 - Java 平台的批处理应用程序使用分区提供并行功能。批处理运行时可以在不同的分区中执行一个步骤,以加快进度。JSR 352 还引入了threads
定义:我们可以定义要使用的线程数,例如
<step id="Step1">
<chunk .../>
<partition>
<plan partitions="3" threads="2"/>
</partition>
</chunk>
</step>
然后我就疑惑了:如何给出一个赞赏的分区方案,让每个线程都被占用,保证CPU的平衡?
比如有表A、B、C要做,它们的行分别是10亿、100万、1000。该步骤旨在将这些实体处理为文档,一个实体转到一个文档。文件生成的顺序并不重要。这些表实体的CPU时间分别为1s、2s、5s。线程数为 4。
如果有 3 个分区,每个表类型一个,那么该步骤将需要1 * 10^9
几秒钟才能完成,因为:
- 分区 A将占用
1 * 10^9 * 1s = 1 * 10^9s
,在线程 2 上运行 - 分区 B将占用
1 * 10^6 * 2s = 2 * 10^6s
,在线程 3 上运行 - 分区 C将占用
1 * 10^3 * 5s = 5 * 10^3s
,在线程 4 上运行
然而,当线程 2 被占用时,线程 3 是空闲的2 * 10^6s
,线程 4 是空闲的5 * 10^3s
。所以很明显,这不是一个好的分区计划。
我的问题是:
- 在上面的例子中是否有更好的分区计划来完成?
- 我可以考虑:分区是一个消费队列,线程消费这个队列吗?
- 一般来说,我可以/应该使用多少个线程?CPU核心数是一样的吗?
- 一般来说,如何给出一个赞赏的分区计划,让每个线程都被占用并保证CPU的平衡?