2012-03-28 167 views
2

我想知道是否有任何方法可以控制excel计算,例如WB中的几张纸并行重新计算,而其他的不是。我的问题是,在目前的设置下,我的顺序计算过程耗时太长。这个序列是从VBA驱动的,如下所示: 1)vba调用一个插件(excel-dna vb.net插件,它控制数据读取器和附加数据库) 2)插件将数据返回到表格1。按顺序重新计算(第2页,然后是第3页) 3)第4页到第10页按顺序重新计算,但由于每个页面独立地只与页面2相连,所以理论上可以重新计算 - 但如何做到这一点? 4)再次通过1)中描述的通过vba插件调用新数据开始处理excel中的多线程计算很慢

在我的笔记本电脑上运行数据子集(64位,32位excel,英特尔i7)需要54.6秒。有趣的是,如果我关闭多线程,它需要25.8秒!更重要的是,如果我在超高速机器上运行它(2 x Intel Xeon X5570,四核“Nehalem”架构,64位64位excel),它比我的笔记本电脑要慢,需要多线程处理230秒或不处理26秒。

我想知道是否有更好的方法可以利用多核和多线程。缓慢的位似乎是优秀的重新计算,而不是外加速度。任何建议感激。

编辑: 上面的描述有点简化 - 实际上,我还有一个反复的'calc/paste-vales/recalc'过程,它在每张表4-10上运行(迭代继续进行直到一些达到所需的灵敏度,然后才计算整张纸)。我相信这使得在当前设计下运行wb计算是行不通的。

表4-10是相同的(硬编码输入参数除外)并且彼此之间没有计算依赖关系。如果每个计算过程(提到的迭代过程和表格计算)可以并行而不是顺序完成,我认为整个过程会更快。我已经进行了更为明显的精简和测试(分解公式,分离易失性函数等)。

在整个过程中运行我的整个数据集大约需要16个小时,这就是为什么我想找到一些方法来改善这一点。

谢谢!

回答

2
  • 下面是阅读Excel计算性能的一个很好的开始:http://www.decisionmodels.com/calcsecretsc.htm

  • 您可以使用像[ExcelFunction(IsThreadSafe = true)]这样的属性将Excel-DNA函数标记为线程安全,尽管这听起来不像这里的瓶颈。这将允许这些功能同时进行评估。

  • 如果您的i7处理器具有超线程(因此它向Windows报告4个内核,但实际上只有两个实际内核),那么将Excel线程数设置为内核数可以更快(例如2 )而不是处理器可以运行的线程数(这可能是Excel的默认值 - 也许是4)。

+0

嗨戈弗特。这个excel-dna和dotnet datareader方面看起来非常有效。在任何情况下,我都会根据您的建议对数据子集运行微时间测试: 关闭多线程(28.3);在+ 1线程(30.3); + 2线程(70.8);所有可用的处理器(65.1)。切换IsExceptionSafe = True并且IsThreadSafe = True没有引起显着差异(错误和两者均为28.3sec)。我想知道,如果每个工作表的recalc命令是从excel-dna插件发送的,如果它可能以某种方式变得更快?例如vba运行excel-dna插件,然后发送sheet recalc命令。 – Yugmorf 2012-03-30 05:31:55

+0

这里有一些最近关于Excel-DNA的性能讨论和结果:http://groups.google.com/group/exceldna/browse_frm/thread/e331337fcdc22a17。这似乎表明调用工作表通过COM和C API计算并没有什么区别。 – Govert 2012-03-30 07:48:21

+0

谢谢。重新进行前面的讨论。我只注意到使用Threadsafe产生的结果:= True和多线程计算产生了虚假结果。我想我的应用程序是不是线程安全的... – Yugmorf 2012-03-30 09:44:25

1

它对于多线程计算比单线程计算慢是非常不寻常的。

想必您已将计算切换为手动。

您是否在每张纸上使用Sheet.Calculate来“按顺序计算工作表”?如果是这样,使用Application.Calculate可能会更快,并让Excel自动计算重新计算所有工作表的最快方法。

+1

嗨,查尔斯,我读过你的博客的计算速度,并有一些使用你的工作在过去。谢谢。 你是对的 - 我已将计算设置为手动并控制VBA的计算顺序;调用excel-dna插件,将数据加载到第一个工作表中,然后按顺序计算后续工作表; sheet(“Sheet2”)。calculate,sheets(“Sheet3”)。calculate等。 请看我上面的编辑,它给出了更多的细节。 – Yugmorf 2012-03-30 02:41:53

+0

为什么不能同时迭代所有工作表4-10? – 2012-03-30 10:09:44

+0

是的,我非常想在同一时间迭代/计算纸张4-10(=平行)。但我不知道这是如何,除非我运行Excel的单独实例。如果你知道其中一个,有兴趣听到另一种方式 - 这将真正解决我的问题的实质。 – Yugmorf 2012-04-03 12:16:51