内存如何帮助 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# 上的巨大循环的主要内容,如果未能解决你的问题,请参考以下文章

C# WinForm 循环加载图片出现内存不足

分析巨大的 C# 堆转储(超过 10 GB)

如何在 C# 中增加堆栈大小? 1MB 是不够的。我有 32GB 的可用 RAM [重复]

C# 堆和栈

c++和c#之间的共享内存同步

常用的内存管理方法有哪几种