我想知道是否有任何方法可以控制excel计算,以便WB中的多张工作表被并行重新计算,而其他工作表则没有。我的问题是,在目前的设置下,我所采用的顺序计算过程耗时太长。序列是从VBA驱动的,如下所示: 1)vba调用一个addin(excel-dna vb.net addin,它控制一个datareader和附加的数据库) 2)addin将数据返回到工作表1.工作表2-3按顺序重新计算(工作表2,然后3) 3)表4至表10按顺序重新计算,但由于每个单独仅链接到表2,它们理论上可以平行重新计算 - 对吗?但是怎么做呢? 4)通过1)中描述的vba addin调用新数据再次开始处理。
在我的笔记本电脑上运行数据子集(64位,32位excel,intel i7)需要54.6秒。有趣的是,如果我关闭多线程,它需要25.8秒!更重要的是,如果我在超快速机器(2 x Intel Xeon X5570,四核“Nehalem”架构,64位64位excel)上运行它,它比我的笔记本电脑慢,多线程需要230秒或没有26秒。
我想知道是否有更好的方法可以利用多核和多线程。缓慢的位似乎是excel重新计算而不是插入速度。任何建议表示赞赏。
编辑: 上面的描述有点简化 - 实际上,我还有一个迭代的'calc / paste-vales / recalc'进程,它在每个工作表4-10上运行(迭代继续进行,直到达到一些所需的灵敏度,并且只有然后是完整的表格计算)。我相信这使得在当前设计下运行wb计算变得不可行。
表4-10是相同的(硬编码输入参数除外)并且彼此之间没有计算依赖性。如果每个的计算过程(提到的迭代过程和表格计算)可以并行而不是顺序完成,我认为整个过程会更快。
仅供参考,我已经进行了更明显的精简和测试(分解公式,分离易失性函数等)。
在整个过程中运行我的整个数据集需要大约16个小时,这就是为什么我很想找到一些方法来改进这个。
谢谢!
答案 0 :(得分:3)
以下是阅读有关Excel计算效果的良好开端:http://www.decisionmodels.com/calcsecretsc.htm。
您可以使用[ExcelFunction(IsThreadSafe = true)]等属性将Excel-DNA函数标记为线程安全,但这听起来不像是瓶颈。这将允许同时评估这些功能。
如果您的i7处理器具有超线程(因此它向Windows报告4个核心,但实际上只有两个真实核心),那么将Excel线程数设置为核心数就更快(比如说2)而不是处理器可以运行的线程数(这将是Excel默认值 - 可能是4)。
答案 1 :(得分:1)
多线程计算比单线程计算慢得多。
据推测,您已将计算切换为手动。
您是否在每张工作表上使用Sheet.Calculate来“按顺序计算工作表”?如果是这样,使用Application.Calculate可能会更快,让Excel自动计算出重新计算所有工作表的最快方法。