【发布时间】:2016-12-21 09:21:05
【问题描述】:
我有一个库来计算组列表的最佳序列,每个组都有要比较的 SKU 列表。比较逻辑很简单,只需在其计算字段的每个循环上比较 SKU。我使用的数学是每组总 SKU 的置换阶乘。顺序是这个比较循环中最重要的部分。而循环是这个库音序器最关键的部分,这就是我们使用并行循环优化循环的原因,这样速度会更快。
所以想象一下,如果我有 1 个组,有 4 个 SKU = 4 x 3 x 2 x 1 = 24 个序列,我需要循环以找到最佳序列。比较看起来像这样:
- A > B > C > D
- A > B > D > C
- A > C > B > D
- A > C > D > B
- A > D > B > C
- A > D > C > B
- B > A > C > D
- B > A > D > C
- B > C > A > D
- B > C > D > A
- B > D > A > C
- B > D > C > A
- C > A > B > D
- C > A > D > B
- C > B > A > D
- C > B > D > A
- C > D > A > B
- C > D > B > A
- D > A > B > C
- D > A > C > B
- D > B > A > C
- D > B > C > A
- D > C > A > B
- D > C > B > A
以上是一个组内的 4 个 SKU,假设我有几个组,每个组内有超过 4 个 SKU。我的图书馆必须做的置换阶乘如下:
- 5 个 SKU = 120 个序列
- 6 个 SKU = 720 个序列
- 7 SKU = 5,040 个序列
- 8 个 SKU = 40,320 个序列
- 9 个 SKU = 362,880 个序列
- 10 个 SKU = 3,628,800 个序列
- 11 个 SKU = 39,916,800 个序列
- 12 个 SKU = 479,001,600 个序列
我有一份在 AWS 上运行的工作,它有 36 个 CPU 内核和 64 GB 内存。该作业包含 2 个组,A 组有 3 个 SKU,B 组有 13 个 SKU,耗时 2 天多,仍在计算。我从服务器收集的结果是:
- CPU 使用情况:使用了 18 个 CPU 内核
- 内存使用:40% 已使用
问题:
- 内存是否有可能帮助 CPU 完成循环工作?
- 如何最大化所有 CPU 内核以帮助我完成工作?由于目前我只能在 1 个 CPU 上为每个序列执行并行循环,无论如何我可以使用多个 CPU 执行 1 个循环吗?
- 还有其他建议吗?
【问题讨论】:
-
你所说的“并行循环”是什么意思?你在代码中使用
Parallel.foreach()吗? -
在不知道你的方法的情况下很难说什么。你能提供一个最小的工作示例吗?
-
是的,我在我的代码中使用了
Parallel.ForEach。 -
听起来很像您所做的一切都是在数数。 stackoverflow.com/questions/29789028/…
-
它不算数,它更倾向于通过将 1 个 SKU 与另一个寻找最佳序列的 SKU 进行比较来对序列进行排序。
标签: c# loops memory-management parallel-processing parallel.foreach