内存如何帮助 C# 上的巨大循环
Posted
技术标签:
【中文标题】内存如何帮助 C# 上的巨大循环【英文标题】:How does memory helps on a giant looping on C# 【发布时间】: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
。
听起来很像您所做的一切都是在数数。 ***.com/questions/29789028/…
它不算数,它更倾向于通过将 1 个 SKU 与另一个寻找最佳序列的 SKU 进行比较来对序列进行排序。
【参考方案1】:
内存是否有可能帮助 CPU 完成循环工作?
没有。内存使用对性能的影响是双重的:
如果您访问的内存过多,则会对性能产生负面影响,因为 CPU 无法很好地使用其缓存。
如果您知道自己有大量内存,则有时可以存储一些计算的结果,以便以后不必重新计算。但计算机一般不会自动执行此操作,您必须更改程序才能执行此操作。
我不知道你究竟是如何计算出最佳序列的,但也许在计算“A > B > C > D”时,你可以记住“C > D”的结果,并在计算“B >”时重用它A > C > D",或者类似的东西。
这叫space-time tradeoff。
我如何最大化所有 CPU 内核来帮助我完成这项工作?
如果不查看您的代码并了解它为什么不使用所有 CPU,我认为无法回答这个问题。
目前我只能在 1 个 CPU 上为每个序列执行并行循环,是否可以使用多个 CPU 执行 1 个循环?
也许,这取决于循环的具体作用。
还有其他推荐吗?
是的,问一个更具体的问题,最好包括你的代码。
【讨论】:
以上是关于内存如何帮助 C# 上的巨大循环的主要内容,如果未能解决你的问题,请参考以下文章